使用pyqt5滚动X轴

时间:2017-11-07 03:15:57

标签: python plot python-3.5 pyqt5 pyqtgraph

目前我正在开发一个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()

1 个答案:

答案 0 :(得分:0)

如果你作为数据传递的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()