Another question about multiple axis plot in pyqtgraph

600 views
Skip to first unread message

Barbara Matyjasiak

unread,
Jan 13, 2015, 10:10:00 AM1/13/15
to pyqt...@googlegroups.com
Hi everyone,

I've searched in this group solution to my problem but couldn't find it. Probably, answer is very simple, but I'm a newbie and I'll be very grateful if anyone could help me.
I'm trying to use multiple horizontal axes with ImageView. All axes should be linked (I want to zoom and move them at the same time) to one image, but with different ranges, units and labels.
I have a problem with setting different ranges for different axes, all show values of the first axis. setScale() parameter is not enough to get what I want.

Creating image and axes:

pbox = pg.ViewBox()
self.graph = pg.PlotItem(viewBox=pbox, labels={'bottom': ('time', 'sec'), 'left': ('freq', 'kHz')},title=self.title, axisItems={'bottom': self.axis})
self.imv = pg.ImageView(view=self.graph)
self.imv.getView().invertY(False)
self.maps=10*np.log10(self.maps)+10
self.imv.setImage(self.maps,levels=(0, np.max(self.maps)), pos=[self.x0, self.y0], scale=[self.xscale, self.yscale])
self.graph.setAspectLocked(False)
## create a new AxisItem, linked to view
self.ax2 = pg.AxisItem('bottom')
self.graph.layout.addItem(self.ax2, 4, 1)
self.ax2.linkToView(pbox)
self.ax2.setLabel('latitude', color='#0000ff')
## create another AxisItem, linked to view
self.ax3 = pg.AxisItem('bottom')
self.graph.layout.addItem(self.ax3, 5, 1)
self.ax3.linkToView(pbox)
self.ax3.setLabel('longitude', color='#ff0000')

Regards,
Barbara
Message has been deleted

Barbara Matyjasiak

unread,
Jul 7, 2015, 7:36:30 AM7/7/15
to pyqt...@googlegroups.com
After some break I have returned to the problem mentioned above and here is how I somehow solved it:


                pbox = pg.ViewBox()
self.graph = pg.PlotItem(viewBox=pbox, labels={'bottom': ('time', 'sec'), 'left': ('freq', 'kHz')},title=self.title, axisItems={'bottom': self.axis})
self.imv = pg.ImageView(view=self.graph)
self.imv.getView().invertY(False)
self.maps=10*np.log10(self.maps)+10
self.imv.setImage(self.maps,levels=(0, np.max(self.maps)), pos=[self.x0, self.y0], scale=[self.xscale, self.yscale])
self.graph.setAspectLocked(False)


####### Two axes placed at the bottom of the image and moving in the same way as original one ####################

pbox1 = pg.ViewBox()
self.ax2 = pg.AxisItem('bottom')
self.graph.layout.addItem(self.ax2, 4, 1)
self.ax2.linkToView(pbox1)
pbox1.setXLink(pbox)
self.ax2.setLabel('latitude', color='#FACC2E')
self.ax2.setRange(self.latmin*0.95, self.latmax*1.05)


pbox2 = pg.ViewBox()
self.ax3 = pg.AxisItem('bottom')
self.graph.layout.addItem(self.ax3, 5, 1)
self.ax3.linkToView(pbox2)
pbox2.setXLink(pbox) 
self.ax3.setLabel('longitude', color='#04B431')
                self.ax3.setRange(self.lonmin*0.95, self.lonmax*1.05)



######################### Scaling additional axes #############################

def convertRange(value, r1, r2):
return (value - r1[0])*(r2[1] - r2[0])/(r1[1] - r1[0]) + r2[0]
                                         time=[self.x0,self.x1]   <--------- original axis range
 lat=[self.latmin,self.latmax]   <------- additional axis range
 lon=[self.lonmin,self.lonmax] <-------   -||-


def updateRange(view, range):
pbox1.setXRange(convertRange( range[0], time, lat ),convertRange( range[1], time, lat ))
pbox2.setXRange(convertRange( range[0], time, lon ),convertRange( range[1], time, lon ))
 
self.graph.vb.sigXRangeChanged.connect(updateRange)


Maybe it's not the best way to do this, but for me it works.

Regards,
Barbara
 
view1.png
view2.png
Reply all
Reply to author
Forward
0 new messages