Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pyqtgraph plotwidget multiple Y axis plots in wrong area

I have an embedded widget in a QT5 gui connected via PlotWidget. I am trying to plot 2 streams of live data Voltage (self.p1) & Current (self.p2). Voltage on the left axis & Current on the right. So far I have each data stream associated with its relevant axis. However my problem is that the Current plot (self.p2) is not in the correct area of the display. This particular plot appears in the upper left hand corner of the widget, it appears before the LHD axis. Its best to view the image to view the problem.

View Me

.

I know the problem lies in the setup function & self.p2 (Current) is being placed in the wrong location but my searching hasn't produced an answer. Could someone please help?

Code used to generate graph, is called once on start up:

def pg_plot_setup(self): # not working still on left axis
    self.p1 = self.graphicsView.plotItem    

# x axis    
    self.p1.setLabel('bottom', 'Time', units='s', color='g', **{'font-size':'12pt'})
    self.p1.getAxis('bottom').setPen(pg.mkPen(color='g', width=3))

# Y1 axis   
    self.p1.setLabel('left', 'Voltage', units='V', color='r', **{'font-size':'12pt'})
    self.p1.getAxis('left').setPen(pg.mkPen(color='r', width=3))

    self.p2 = pg.ViewBox()  
    self.p1.showAxis('right')
    self.p1.scene().addItem(self.p2)
    self.p1.getAxis('right').linkToView(self.p2)
    self.p2.setXLink(self.p1)

# Y2 axis
    self.p1.setLabel('right', 'Current', units="A", color='c', **{'font-size':'12pt'})  #<font>&Omega;</font>
    self.p1.getAxis('right').setPen(pg.mkPen(color='c', width=3))

and code used to update display, is called via QTimer:

def update_graph_plot(self):
    start = time.time()
    X = np.asarray(self.graph_X, dtype=np.float32)
    Y1 = np.asarray(self.graph_Y1, dtype=np.float32)
    Y2 = np.asarray(self.graph_Y2, dtype=np.float32)

    pen1=pg.mkPen(color='r',width=1.0)
    pen2=pg.mkPen(color='c',width=1.0)

    self.p1.plot(X,Y1,pen=pen1, name="V", clear=True)
    self.p2.addItem(pg.PlotCurveItem(X,Y2,pen=pen2, name="I"))
like image 631
lambcutlet Avatar asked Feb 02 '18 20:02

lambcutlet


1 Answers

I found the answer buried in here MultiplePlotAxes.py

adding this self.p2.setGeometry(self.p1.vb.sceneBoundingRect()) to function 'update_graph_plot' adjusts the size of viewbox each time the scene is updated, but it has to be in the update loop.

or add this self.p1.vb.sigResized.connect(self.updateViews) to function 'pg_plot_setup' as part of the setup, which shall then automatically call this function

def updateViews(self):
        self.p2.setGeometry(self.p1.vb.sceneBoundingRect())

to resize viewbox (self.p2) each time self.p1 updates. enter image description here

like image 183
lambcutlet Avatar answered Oct 11 '22 06:10

lambcutlet