【问题标题】:Is it possible to recreate a pyqtgraph without data是否可以在没有数据的情况下重新创建 pyqtgraph
【发布时间】:2021-04-07 09:00:32
【问题描述】:

我有一个基于 pyqt5 的应用程序,我在其中打开一个文件并根据文件中的数据绘制 2 个不同的图。现在我想打开另一个类似的文件,但我想保存 2 个绘图的状态/视图,以便我可以快速返回到以前的绘图/视图,而不必通过读取数据再次绘制它。是否有可能保存绘图的状态/视图以非常快速地重新创建它?

【问题讨论】:

    标签: pyqt5 pyqtgraph


    【解决方案1】:

    您可以从此answer指导。

    基本上,您可以使用来自pyqtgraphPlotWidget 类。

    • 生成PlotWidget

      import pyqtgraph as pg
      plot_widget = pg.PlotWidget()
      
    • 使用plot() 方法并将PlotDataItem 存储在一个变量中。 PlotDataItem 将包含该特定图的信息:x 数据、y 数据、线的颜色、线宽,...

      plot_item = plot_widget.plot(xData, yData)
      
    • 有了这个,您可以随时使用addItem()removeItem() 方法从绘图中添加/删除项目

      plot_widget.removeItem(plot_item)
      plot_widget.addItem(plot_item)
      

    编辑:

    要获取绘图的视图状态,可以使用PlotWidget 类的viewRect() 方法。它将返回一个包含视图状态信息的QRectF 对象,如下所示:

    PyQt5.QtCore.QRectF(x_0, y_0, w, h)
    

    地点:

    • x_0y_0 是视图开始的坐标。
    • wh 是视图区域的宽度和高度。

    另外,您可以使用PlotWidget 类的setRange() 方法恢复视图。

    示例:

    这是一个实现的例子:

    import sys
    import numpy as np
    import pyqtgraph as pg
    from pyqtgraph.Qt import QtGui
    
    class MyApp(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
        
            self.central_layout = QtGui.QVBoxLayout()
            self.buttons_layout = QtGui.QVBoxLayout()
            self.boxes_layout = QtGui.QHBoxLayout()
            self.save = QtGui.QPushButton('Save View')
            self.set = QtGui.QPushButton('Set View')
            self.boxes = [QtGui.QCheckBox(f"Box {i+1}") for i in range(3)]
            self.plot_widget = pg.PlotWidget()
            self.plot_data = [None for _ in range(3)]
            self.state = [False for _ in range(3)]
            
            self.setLayout(self.central_layout)
            self.central_layout.addWidget(self.plot_widget)
            self.central_layout.addLayout(self.buttons_layout)
            self.buttons_layout.addLayout(self.boxes_layout)
            self.buttons_layout.addWidget(self.save)
            self.buttons_layout.addWidget(self.set)
            for i in range(3):
                self.boxes_layout.addWidget(self.boxes[i])
                self.boxes[i].stateChanged.connect(self.box_changed)
            self.create_data()
            
            self.save.clicked.connect(self.save_view)
            self.set.clicked.connect(self.set_view)
            self.view_state = None
            self.save_view()
                
        def create_data(self):
            x = np.linspace(0, 3.14, 100)
            y = [np.sin(x), np.cos(x), np.sin(x)**2]
            for i in range(3):
                self.plot_data[i] = pg.PlotDataItem(x, y[i])
    
        def box_changed(self):
            for i in range(3):
                if self.boxes[i].isChecked() != self.state[i]:
                    self.state[i] = self.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
        
        def save_view(self):
            self.view_state = self.plot_widget.viewRect()
         
        def set_view(self):
            self.plot_widget.setRange(self.view_state)
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        window = MyApp()
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 您的问题显然没有回答 OP 的要求。 OP的问题是如何保存和恢复绘图的状态,例如在显示初始绘图后,用户缩放然后关闭窗口,当应用程序打开时,绘图必须具有与以前相同的缩放关闭窗口。您的答案如何涵盖该问题?
    • addItem 和 removeItem 不能帮助我重新创建与@eyllanesc 提到的相同的绘图视图。
    • @saras 对不起,我缺席了两个星期。我编辑了答案,现在它满足了您提出的要求。
    • @eyllanesc 你是对的,我编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 2011-04-21
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2013-08-21
    相关资源
    最近更新 更多