使用pyqt5滚动X轴
Scrolling X-axis with pyqt5
目前我正在开发一个 GUI,它有来自 Arduino 的传入数据并且正在绘制。现在正在根据最后 50 个样本绘制它。我找到了一种方法来增加 X 轴的大小,但是我希望它随着数据的输入而移动,这样它就可以表示时间而不是已经看到的样本。我还想看看如何放置 x 轴标签。 matplotlib的方法试过了,还是不行。
class GUI(QWidget, Ui_DynoTest1):
def __init__(self, parent=None, border = None):
# This is what is used to make the graph.
QWidget.__init__(self, parent)
self.setupUi(self)
self.thread = GetData(self)
self.thread.dataChanged.connect(self.onDataChanged)
self.thread.start()
self.torque = []
self.horse_power = []
layout = QHBoxLayout()
self.plot = pg.PlotWidget()
layout.addWidget(self.plot)
self.plot.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
self.graphicsView.setLayout(layout)
self.p1 = self.plot.plotItem
self.p1.setLabels(left='Torque')
self.TorqueCurve = self.p1.plot()
self.TorqueCurve.setPen(pg.mkPen(QColor(0,0,0), width=2.5))
self.p2 = pg.ViewBox()
self.HorsePowerCurve = pg.PlotCurveItem()
self.HorsePowerCurve.setPen(pg.mkPen(QColor(0, 0, 255), width=2.5))
self.p2.addItem(self.HorsePowerCurve)
self.p1.scene().addItem(self.p2)
self.p1.showAxis('right')
self.p1.getAxis('right').setLabel('HorsePower', color='#0000ff')
self.p1.getAxis('right').linkToView(self.p2)
self.p1.vb.sigResized.connect(self.updateViews)
if len(self.torque) < 50:
self.torque.append(Torque)
else:
self.torque[:-1] = self.torque[1:] + [Torque]
if len(self.horse_power) < 50:
self.horse_power.append(HorsePower)
else:
self.horse_power[:-1] = self.horse_power[1:] + [HorsePower]
self.TorqueCurve.setData(self.torque)
self.HorsePowerCurve.setData(self.horse_power)
self.updateViews()
如果一个 pyqtgraph 只作为数据传递一个列表,这将放置 x 轴,但是如果我们传递两个轴并使用我们的轴,我们必须创建一个列表,为它提供时间,我们使用一个变量这样可以节省初始时间。
如果要为 x 放置标签,可以使用以下模式之一:
self.p1.setLabels(left='Torque', bottom='Time')
self.p1.setLabel('bottom', 'Time', units="samples")
第一个可以指定所有标签,第二个可以单独指定。
class GUI(QWidget, Ui_DynoTest1):
def __init__(self, parent=None):
[...]
self.torque = []
self.horse_power = []
self.time = []
self.counter = 0
[...]
self.p1 = self.plot.plotItem
self.p1.setLabels(left='Torque', bottom='Time')
# self.p1.setLabel('bottom', 'Time', units="samples")
[...]
def onDataChanged(self, Force, RPM, Max_RPM, Torque, Max_Torque, HorsePower, Max_HorsePower, Run_Time):
[...]
if self.counter < 50:
self.torque.append(Torque)
self.horse_power.append(HorsePower)
self.time.append(Run_Time)
else:
self.torque = self.torque[1:] + [Torque]
self.horse_power = self.horse_power[1:] + [HorsePower]
self.time = self.time[1:] + [Run_Time]
self.HorsePowerCurve.setData(self.time, self.horse_power)
self.TorqueCurve.setData(np.array(self.time), self.torque)
self.updateViews()
目前我正在开发一个 GUI,它有来自 Arduino 的传入数据并且正在绘制。现在正在根据最后 50 个样本绘制它。我找到了一种方法来增加 X 轴的大小,但是我希望它随着数据的输入而移动,这样它就可以表示时间而不是已经看到的样本。我还想看看如何放置 x 轴标签。 matplotlib的方法试过了,还是不行。
class GUI(QWidget, Ui_DynoTest1):
def __init__(self, parent=None, border = None):
# This is what is used to make the graph.
QWidget.__init__(self, parent)
self.setupUi(self)
self.thread = GetData(self)
self.thread.dataChanged.connect(self.onDataChanged)
self.thread.start()
self.torque = []
self.horse_power = []
layout = QHBoxLayout()
self.plot = pg.PlotWidget()
layout.addWidget(self.plot)
self.plot.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
self.graphicsView.setLayout(layout)
self.p1 = self.plot.plotItem
self.p1.setLabels(left='Torque')
self.TorqueCurve = self.p1.plot()
self.TorqueCurve.setPen(pg.mkPen(QColor(0,0,0), width=2.5))
self.p2 = pg.ViewBox()
self.HorsePowerCurve = pg.PlotCurveItem()
self.HorsePowerCurve.setPen(pg.mkPen(QColor(0, 0, 255), width=2.5))
self.p2.addItem(self.HorsePowerCurve)
self.p1.scene().addItem(self.p2)
self.p1.showAxis('right')
self.p1.getAxis('right').setLabel('HorsePower', color='#0000ff')
self.p1.getAxis('right').linkToView(self.p2)
self.p1.vb.sigResized.connect(self.updateViews)
if len(self.torque) < 50:
self.torque.append(Torque)
else:
self.torque[:-1] = self.torque[1:] + [Torque]
if len(self.horse_power) < 50:
self.horse_power.append(HorsePower)
else:
self.horse_power[:-1] = self.horse_power[1:] + [HorsePower]
self.TorqueCurve.setData(self.torque)
self.HorsePowerCurve.setData(self.horse_power)
self.updateViews()
如果一个 pyqtgraph 只作为数据传递一个列表,这将放置 x 轴,但是如果我们传递两个轴并使用我们的轴,我们必须创建一个列表,为它提供时间,我们使用一个变量这样可以节省初始时间。
如果要为 x 放置标签,可以使用以下模式之一:
self.p1.setLabels(left='Torque', bottom='Time')
self.p1.setLabel('bottom', 'Time', units="samples")
第一个可以指定所有标签,第二个可以单独指定。
class GUI(QWidget, Ui_DynoTest1):
def __init__(self, parent=None):
[...]
self.torque = []
self.horse_power = []
self.time = []
self.counter = 0
[...]
self.p1 = self.plot.plotItem
self.p1.setLabels(left='Torque', bottom='Time')
# self.p1.setLabel('bottom', 'Time', units="samples")
[...]
def onDataChanged(self, Force, RPM, Max_RPM, Torque, Max_Torque, HorsePower, Max_HorsePower, Run_Time):
[...]
if self.counter < 50:
self.torque.append(Torque)
self.horse_power.append(HorsePower)
self.time.append(Run_Time)
else:
self.torque = self.torque[1:] + [Torque]
self.horse_power = self.horse_power[1:] + [HorsePower]
self.time = self.time[1:] + [Run_Time]
self.HorsePowerCurve.setData(self.time, self.horse_power)
self.TorqueCurve.setData(np.array(self.time), self.torque)
self.updateViews()