如何更新 pyqtgraph 中的绘图?

2023-12-24

我正在尝试使用 PyQt5 和 pyqtgraph 拥有一个用户界面。我制作了两个复选框,每当我选择它们时,我想绘制代码中可用的两个数据集之一,每当我取消选择按钮时,我希望它清除相应的曲线。有两个带有文本的复选框A1 and A2他们每个人都绘制一组数据。

我有两个问题:

1-如果我选择A1它绘制与相关的数据A1只要我不选择A2,通过取消选择A1我可以清除相关数据A1。 但是,如果我检查A1框,然后我检查A2框,然后取消选择A1不清除相关情节。在这种情况下,如果我选择绘制随机数据,而不是确定性曲线,例如sin,我看到通过选择任一按钮都会添加新数据,但无法删除它。

2- 真实的应用程序有 96 个按钮,每个按钮都应与一个数据集相关联。我认为我编写代码的方式效率很低,因为我需要为一个按钮和数据集复制相同的代码 96 次。有没有办法将我下面介绍的玩具代码概括为任意数量的复选框?或者,为每个按钮使用/复制几乎相同的代码可能是执行此操作的常用且正确的方法?

代码是:

from PyQt5 import QtWidgets, uic, QtGui
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
import numpy as np
import sys
import string
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore

app = QtWidgets.QApplication(sys.argv)

x = np.linspace(0, 3.14, 100)
y1 = np.sin(x)#Data number 1 associated to checkbox A1
y2 = np.cos(x)#Data number 2 associated to checkbox A2

#This function is called whenever the state of checkboxes changes
def todo():
    if cbx1.isChecked():
        global curve1
        curve1 = plot.plot(x, y1, pen = 'r')
    else:
        try:
            plot.removeItem(curve1)
        except NameError:
            pass
    if cbx2.isChecked():
        global curve2
        curve2 = plot.plot(x, y2, pen = 'y')
    else:
        try:
            plot.removeItem(curve2)
        except NameError:
            pass  
#A widget to hold all of my future widgets
widget_holder = QtGui.QWidget()

#Checkboxes named A1 and A2
cbx1 = QtWidgets.QCheckBox()
cbx1.setText('A1')
cbx1.stateChanged.connect(todo)

cbx2 = QtWidgets.QCheckBox()
cbx2.setText('A2')
cbx2.stateChanged.connect(todo)

#Making a pyqtgraph plot widget
plot = pg.PlotWidget()

#Setting the layout
layout = QtGui.QGridLayout()
widget_holder.setLayout(layout)

#Adding the widgets to the layout
layout.addWidget(cbx1, 0,0)
layout.addWidget(cbx2, 0, 1)
layout.addWidget(plot, 1,0, 3,1)

widget_holder.adjustSize()
widget_holder.show()

sys.exit(app.exec_())


    

下面是我制作的一个示例,效果很好。 可以重复使用做更多的绘图,无需增加代码,只需更改self.num并使用函数添加相应的数据add_data(x,y,ind), where x and y是数据的值,ind是盒子的索引(来自0 to n-1).

import sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui

class MyApp(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.central_layout = QtGui.QVBoxLayout()
        self.plot_boxes_layout = QtGui.QHBoxLayout()
        self.boxes_layout = QtGui.QVBoxLayout()
        self.setLayout(self.central_layout)
        
        # Lets create some widgets inside
        self.label = QtGui.QLabel('Plots and Checkbox bellow:')
        
        # Here is the plot widget from pyqtgraph
        self.plot_widget = pg.PlotWidget()
        
        # Now the Check Boxes (lets make 3 of them)
        self.num = 6
        self.check_boxes = [QtGui.QCheckBox(f"Box {i+1}") for i in range(self.num)]
        
        # Here will be the data of the plot
        self.plot_data = [None for _ in range(self.num)]
        
        # Now we build the entire GUI
        self.central_layout.addWidget(self.label)
        self.central_layout.addLayout(self.plot_boxes_layout)
        self.plot_boxes_layout.addWidget(self.plot_widget)
        self.plot_boxes_layout.addLayout(self.boxes_layout)
        for i in range(self.num):
            self.boxes_layout.addWidget(self.check_boxes[i])
            # This will conect each box to the same action
            self.check_boxes[i].stateChanged.connect(self.box_changed)
            
        # For optimization let's create a list with the states of the boxes
        self.state = [False for _ in range(self.num)]
        
        # Make a list to save the data of each box
        self.box_data = [[[0], [0]] for _ in range(self.num)] 
        x = np.linspace(0, 3.14, 100)
        self.add_data(x, np.sin(x), 0)
        self.add_data(x, np.cos(x), 1)
        self.add_data(x, np.sin(x)+np.cos(x), 2)
        self.add_data(x, np.sin(x)**2, 3)
        self.add_data(x, np.cos(x)**2, 4)
        self.add_data(x, x*0.2, 5)
        

    def add_data(self, x, y, ind):
        self.box_data[ind] = [x, y]
        if self.plot_data[ind] is not None:
            self.plot_data[ind].setData(x, y)

    def box_changed(self):
        for i in range(self.num):
            if self.check_boxes[i].isChecked() != self.state[i]:
                self.state[i] = self.check_boxes[i].isChecked()
                if self.state[i]:
                    if self.plot_data[i] is not None:
                        self.plot_widget.addItem(self.plot_data[i])
                    else:
                        self.plot_data[i] = self.plot_widget.plot(*self.box_data[i])
                else:
                    self.plot_widget.removeItem(self.plot_data[i])
                break
        
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

请注意,内部德PlotWidget我使用添加情节plot()方法,它返回一个PlotDataItem保存在调用之前创建的列表中self.plot_data。 有了这个,您可以轻松地将其从Plot Widget并再次添加。此外,如果您的目标是更复杂的程序,例如,您可以在运行时更改每个框的数据,那么如果您使用setData()方法上的PlotDataItem

正如我在一开始所说的,这应该适用于很多复选框,因为当复选框被选中/取消选中时调用的函数,首先将每个框的实际状态与前一个框进行比较(存储在self.state)并且只对与该特定框相对应的图进行更改。这样,您就可以避免为每个复选框执行一个函数,并避免每次选中/取消选中某个框时重新绘制所有 de 框(例如用户8408080 https://stackoverflow.com/users/8408080/user8408080做过)。我并不是说这不好,但如果增加复选框的数量和/或数据的复杂性,重新绘制所有数据的工作量将急剧增加。

唯一的问题是,当窗口太小而无法支持大量复选框(例如 96 个)时,您将不得不在另一个小部件而不是布局中组织复选框。

Now some screenshots of the code from above: enter image description here

然后改变值self.num to 6并向其中添加一些随机数据:

self.add_data(x, np.sin(x)**2, 3)
self.add_data(x, np.cos(x)**2, 4)
self.add_data(x, x*0.2, 5)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更新 pyqtgraph 中的绘图? 的相关文章

随机推荐

  • Windows Batch:如何删除所有空白(或空)行

    我正在尝试使用 Windows 批处理程序从文本文件中删除所有空白行 我知道实现这一目标的最简单方法是sh通过正则表达式和 sed 命令 sed i d test txt 问题 Windows批处理有类似的吗simple从文本文件中删除所有
  • 使用 Log4Net 以编程方式强制创建新的日志文件

    注意 我阅读了这个问题和答案 它不适用于我想要的 Log4Net 以编程方式指定多个记录器 具有多个文件附加程序 https stackoverflow com questions 308436 log4net programmatical
  • 实现 getarg 子例程调用

    我在 F90 中编写了一个程序 它从文本文件中读取一些输入数组 然后通过一个函数将它们组合到一个输出文件中 其中一个输入文件以使用 MMDDYY tuvr 收集数据的日期命名 然后输出文件命名为 MMDDYY fxi 我希望能够在运行程序时
  • 连接到 Redis 时,Unix 套接字比 tcp 慢

    我正在开发高性能 Web 服务器 应处理 2k 同时连接和 40k QPS 实现响应时间 它的作用是查询 Redis 服务器 在同一主机上运行 并将响应返回给客户端 在测试过程中 我观察到使用 TCP STREAM SOCKET 的实现比使
  • 无法获取 UserManager 类

    我想做的是添加一个新的管理员用户并为其分配管理员角色 所以 我去了Startup cs班级在Configure方法并编写了以下代码 var context app ApplicationServices GetService
  • 在 raku REPL 中定义后缀运算符时出现问题

    如果我在 raku 中有以下程序 它运行良好 trabajando en piensa en raku on master via v2 6 5 cat factorial raku sub factorial n 1 n sub post
  • 有没有一种快速方法将实体转换为 .csv 文件?

    目前 我有 string outputRow string Empty foreach var entityObject in entityObjects outputRow entityObject field1 entityObject
  • 将 matplotlib 绘图轴设置为数据框列名称

    我有一个像这样的数据框 data DataFrame Sbet 1 2 3 4 5 Length 2 4 6 8 10 然后我有一个函数可以绘制并拟合这些数据 def lingregress x y slope intercept r va
  • 为什么Java中局部变量没有初始化?

    Java 的设计者是否认为局部变量不应该被赋予默认值 说真的 如果实例变量可以被赋予默认值 那么为什么我们不能对局部变量做同样的事情呢 它还会导致问题 如中所述对博客文章的这条评论 http javahowto blogspot com 2
  • 合并两个重叠列表并保持顺序的 Pythonic 方法

    好吧 我有两个列表 如下所示 他们可以并且将会有重叠的项目 例如 1 2 3 4 5 4 5 6 7 这里将not是重叠中的附加项目 例如 这将not发生 1 2 3 4 5 3 5 4 5 6 7 这些列表不一定是有序的 也不一定是唯一的
  • 如何将纬度/经度对转换为 PostGIS 地理类型?

    我正在尝试将一堆纬度 经度对加载到 PostGIS 地理类型中 以便能够按位置查询 特别是我有一个带有浮动纬度和经度列的表格以及一个geography Point 4326 柱子 我想要做 update mytable set geogra
  • 如何在单个画布android中移动多个位图

    我想在同一画布上移动多个位图 使用下面的代码 我可以在触摸屏幕时移动一个位图 但是 我无法识别位图上的触摸事件 因此我无法移动特定的位图 public class DrawTopologyView extends View Paint pa
  • Rails 7.0 + esbuild:运行应用程序出现错误:找不到命令“build”

    新生成的带有 esbuild 选项的 Rails 7 0 在启动时出错 rails new project name javascript esbuild css tailwind 在创建新的 Rails 7 项目时 我尝试使用以下命令启动
  • android.intent.action.DOWNLOAD_COMPLETE 是显式广播吗?

    我的应用程序 targetSdk 25 在清单中定义了一个广播接收器 如下所示
  • 如何在剃刀视图上设置必填字段?

    我想将 data val required 和 data val 属性添加到 html textbox 或 Html EditorFor 元素 是否可以不重写视图 通常您不应该重写视图来实现这一点 您应该使用相应的验证属性来装饰视图模型属性
  • 如何在 ipython-notebook 中获取 sympy 表达式的乳胶表?

    我正在使用 sympy 从多个表达式中收集术语 并希望将结果 在 ipython notebook 内 格式化在一个表中 其中术语位于最左边的列中 后续的每一列代表一个表达式 该列中的条目来自dict由返回sympy collect sym
  • 如何将 Phantom 钱包连接到我的 Flutter Web 应用程序?

    我一直在尝试将 Flutter Web 应用程序连接到 Phantom 钱包 但没有成功 尚未发布 pub dev 软件包来实现此目的 并且无法弄清楚如何使用 dart js 互操作来实现此目的 想知道是否有人已经弄清楚了 我有一段 粗略的
  • 返回活动时如何保留 Android ListView 滚动位置? [复制]

    这个问题在这里已经有答案了 可能的重复 返回 ListView 时保持 保存 恢复滚动位置 https stackoverflow com questions 3014089 maintain save restore scroll pos
  • 加权词嵌入是什么意思?

    In the paper http www aclweb org anthology S17 2100我正在努力实施 它说 在这项工作中 使用三种类型的文本对推文进行建模 表示 第一个是词袋模型 权重为 tf idf 词频 逆文档频率 部分
  • 如何更新 pyqtgraph 中的绘图?

    我正在尝试使用 PyQt5 和 pyqtgraph 拥有一个用户界面 我制作了两个复选框 每当我选择它们时 我想绘制代码中可用的两个数据集之一 每当我取消选择按钮时 我希望它清除相应的曲线 有两个带有文本的复选框A1 and A2他们每个人