【发布时间】:2021-04-07 09:00:32
【问题描述】:
我有一个基于 pyqt5 的应用程序,我在其中打开一个文件并根据文件中的数据绘制 2 个不同的图。现在我想打开另一个类似的文件,但我想保存 2 个绘图的状态/视图,以便我可以快速返回到以前的绘图/视图,而不必通过读取数据再次绘制它。是否有可能保存绘图的状态/视图以非常快速地重新创建它?
【问题讨论】:
我有一个基于 pyqt5 的应用程序,我在其中打开一个文件并根据文件中的数据绘制 2 个不同的图。现在我想打开另一个类似的文件,但我想保存 2 个绘图的状态/视图,以便我可以快速返回到以前的绘图/视图,而不必通过读取数据再次绘制它。是否有可能保存绘图的状态/视图以非常快速地重新创建它?
【问题讨论】:
您可以从此answer指导。
基本上,您可以使用来自pyqtgraph 的PlotWidget 类。
生成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_0 和 y_0 是视图开始的坐标。w 和 h 是视图区域的宽度和高度。另外,您可以使用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_())
【讨论】: