2015-04-06 482 views
1

我在pyqtgraph 中找到了MultiplePlotAxes示例,并用一个更多的y轴扩展它(请参阅下面的代码)。 现在右侧有3个y轴。pyqtgraph:左侧有多个y轴?

是否有一种方式来获得从右侧的所有3 y轴的左边,这样总共有4 y轴左边?:

因为例如 ax3 = pg.AxisItem('left')唯一变化标签的方向和轴的刻度,而不是轴相对于坐标原点的位置。

体改MultiplePlotAxes,例如

import pyqtgraph as pg 
from pyqtgraph.Qt import QtCore, QtGui 
import numpy as np 

pg.mkQApp() 

pw = pg.PlotWidget() 
pw.show() 
pw.setWindowTitle('pyqtgraph example: MultiplePlotAxes') 
p1 = pw.plotItem 
p1.setLabels(left='axis 1') 


p2 = pg.ViewBox() 
p1.showAxis('right') 
p1.scene().addItem(p2) 
p1.getAxis('right').linkToView(p2) 
p2.setXLink(p1) 
p1.getAxis('right').setLabel('axis2', color='#0000ff') 


p3 = pg.ViewBox() 
ax3 = pg.AxisItem('right') 

p1.layout.addItem(ax3, 2, 3) 
p1.scene().addItem(p3) 

p4 = pg.ViewBox() 
ax4 = pg.AxisItem('right') 

p1.layout.addItem(ax4, 2, 4) 
p1.scene().addItem(p4) 

ax3.linkToView(p3) 
p3.setXLink(p1) 
ax3.setZValue(-10000) 
ax3.setLabel('axis 3', color='#ff0000') 

ax4.linkToView(p4) 
p4.setXLink(p1) 
ax4.setZValue(-10000) 
ax4.setLabel('axis 4', color='#ff5555') 


def updateViews(): 
    global p1, p2, p3, p4 
    p2.setGeometry(p1.vb.sceneBoundingRect()) 
    p3.setGeometry(p1.vb.sceneBoundingRect()) 
    p4.setGeometry(p1.vb.sceneBoundingRect()) 

    p2.linkedViewChanged(p1.vb, p2.XAxis) 
    p3.linkedViewChanged(p1.vb, p3.XAxis) 
    p4.linkedViewChanged(p1.vb, p4.XAxis) 

updateViews() 
p1.vb.sigResized.connect(updateViews) 


p1.plot([1,2,4,8,16,32]) 
p2.addItem(pg.PlotCurveItem([10,20,40,80,40,20], pen='b')) 
p3.addItem(pg.PlotCurveItem([3200,1600,800,400,200,100], pen='r')) 


if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

回答

8

前一段时间,因为我已经发布了,从我的结论是不恰当的其他地方没有回答在三个星期,所以我拉这一个我自己原来的问题..

它认真地花了我一段时间,直到我找出它,但是,现在有一个很好的解决方案,以防万一有人挑这个线程,这是它应该是什么样子,这是在我的机构中通用的数据表示方式。 具有多个y轴的pyqtgraph图:http://i.stack.imgur.com/joP5l.png

@Luke:为什么不使用这个作为多个左侧y轴的示例?

下面是它的代码:

from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 

pg.mkQApp() 

# Axis 
a2 = pg.AxisItem("left") 
a3 = pg.AxisItem("left") 
a4 = pg.AxisItem("left") 
a5 = pg.AxisItem("left") 
a6 = pg.AxisItem("left") 

# ViewBoxes 
v2 = pg.ViewBox() 
v3 = pg.ViewBox() 
v4 = pg.ViewBox() 
v5 = pg.ViewBox() 
v6 = pg.ViewBox() 

# main view 
pw = pg.GraphicsView() 
pw.setWindowTitle('pyqtgraph example: multiple y-axis') 
pw.show() 

# layout 
l = pg.GraphicsLayout() 
pw.setCentralWidget(l) 

# add axis to layout 
## watch the col parameter here for the position 
l.addItem(a2, row = 2, col = 5, rowspan=1, colspan=1) 
l.addItem(a3, row = 2, col = 4, rowspan=1, colspan=1) 
l.addItem(a4, row = 2, col = 3, rowspan=1, colspan=1) 
l.addItem(a5, row = 2, col = 2, rowspan=1, colspan=1) 
l.addItem(a6, row = 2, col = 1, rowspan=1, colspan=1) 

# plotitem and viewbox 
## at least one plotitem is used whioch holds its own viewbox and left axis 
pI = pg.PlotItem() 
v1 = pI.vb # reference to viewbox of the plotitem 
l.addItem(pI, row = 2, col = 6, rowspan=1, colspan=1) # add plotitem to layout 

# add viewboxes to layout 
l.scene().addItem(v2) 
l.scene().addItem(v3) 
l.scene().addItem(v4) 
l.scene().addItem(v5) 
l.scene().addItem(v6) 

# link axis with viewboxes 
a2.linkToView(v2) 
a3.linkToView(v3) 
a4.linkToView(v4) 
a5.linkToView(v5) 
a6.linkToView(v6) 

# link viewboxes 
v2.setXLink(v1) 
v3.setXLink(v2) 
v4.setXLink(v3) 
v5.setXLink(v4) 
v6.setXLink(v5) 

# axes labels 
pI.getAxis("left").setLabel('axis 1 in ViewBox of PlotItem', color='#FFFFFF') 
a2.setLabel('axis 2 in Viewbox 2', color='#2E2EFE') 
a3.setLabel('axis 3 in Viewbox 3', color='#2EFEF7') 
a4.setLabel('axis 4 in Viewbox 4', color='#2EFE2E') 
a5.setLabel('axis 5 in Viewbox 5', color='#FFFF00') 
a6.setLabel('axis 6 in Viewbox 6', color='#FE2E64') 

# slot: update view when resized 
def updateViews(): 

    v2.setGeometry(v1.sceneBoundingRect()) 
    v3.setGeometry(v1.sceneBoundingRect()) 
    v4.setGeometry(v1.sceneBoundingRect()) 
    v5.setGeometry(v1.sceneBoundingRect()) 
    v6.setGeometry(v1.sceneBoundingRect()) 

# data 
x = [1,2,3,4,5,6] 
y1 = [0,4,6,8,10,4] 
y2 = [0,5,7,9,11,3] 
y3 = [0,1,2,3,4,12] 
y4 = [0,8,0.3,0.4,2,5] 
y5 = [0,1,6,4,2,1] 
y6 = [0,0.2,0.3,0.4,0.5,0.6] 

# plot 
v1.addItem(pg.PlotCurveItem(x, y1, pen='#FFFFFF')) 
v2.addItem(pg.PlotCurveItem(x, y2, pen='#2E2EFE')) 
v3.addItem(pg.PlotCurveItem(x, y3, pen='#2EFEF7')) 
v4.addItem(pg.PlotCurveItem(x, y4, pen='#2EFE2E')) 
v5.addItem(pg.PlotCurveItem(x, y5, pen='#FFFF00')) 
v6.addItem(pg.PlotCurveItem(x, y6, pen='#FE2E64')) 

# updates when resized 
v1.sigResized.connect(updateViews) 

# autorange once to fit views at start 
v2.enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) 
v3.enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) 
v4.enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) 
v5.enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) 
v6.enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) 

updateViews() 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_()