Skip to main content
 首页 » 编程设计

python之pyqtgraph:左侧有多个 y 轴

2025年05月04日9wuhuacong

我在 pyqtgraph 中找到了 MultiplePlotAxes-example 并用一个 y 轴扩展它(见下面的代码)。 所以现在右侧有 3 个 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_() 

请您参考如下方法:

前一段时间,因为我已经发布了原始问题,根据我的发现,这个问题在其他地方没有得到适当的回答,而不是在三周内,所以我自己提出了这个问题......

我真的花了一段时间才弄明白,但是,是的,现在有一个很好的解决方案,以防万一有人拿起这个帖子,它应该是这样的,顺便说一句我机构中数据的通用表示。 具有多个 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_()