pyqtgraph:在缩放时保持 TextItem 的恒定位置

Posted

技术标签:

【中文标题】pyqtgraph:在缩放时保持 TextItem 的恒定位置【英文标题】:pyqtgraph: maintain constant position of TextItem while scaling 【发布时间】:2017-11-28 05:34:11 【问题描述】:

我想要一个 TextItem,它在缩放 y 轴的同时保持图形上的恒定位置,与图例的功能基本相同,只是作为 TextItem,我可以根据需要更改文本。我无法弄清楚如何做到这一点。欢迎任何建议。

这个例子说明了这个问题。在左侧图表中,缩放 y 轴会导致文本移动,而在右侧图表中,图例在您缩放时保持在恒定位置。我希望将 textItem 的位置定义为图例位置,相对于图形窗口处于恒定位置。或者,如果有人知道如何更改图例的格式并更新也可以使用的文本,但根据我对文档的阅读,这是不可能的。

import pyqtgraph as pg 
from PyQt4 import QtGui 
import numpy as np 
import sys 
def main(): 
    app = QtGui.QApplication(sys.argv) 
    widg = QtGui.QWidget() 
    widg.move(100, 100) 
    pg.setConfigOption('background', 'w')
    pg.setConfigOption('foreground', 'k') 

    pgWidg = pg.GraphicsLayoutWidget()   
    pgWidg.resize(750, 250)  

    graph1 = pgWidg.addPlot(row=1, col=1) 
    graph2 = pgWidg.addPlot(row=1, col=2)
    curve1 = graph1.plot(y=np.sin(np.linspace(1, 21, 1000)), pen='k') 
    curve2 = graph2.plot(y=np.sin(np.linspace(1, 21, 1000)), pen='k') 

    graph1.addItem(curve1) 
    graph2.addItem(curve2) 
    graph1.setMouseEnabled(x=False, y=True)
    graph2.setMouseEnabled(x=False, y=True)

    graph1Text = pg.TextItem(text = 'A1', color=(0, 0, 0))
    graph1.addItem(graph1Text)
    graph1Text.setPos(150, 1)

    legend = graph2.addLegend()
    style = pg.PlotDataItem(pen='w')
    legend.addItem(style, 'A2')

    grid = QtGui.QGridLayout() 
    grid.addWidget(pgWidg, 0,0)          
    widg.setLayout(grid) 
    widg.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()

【问题讨论】:

请出示您的代码 已经发布了一些示例代码。 【参考方案1】:

70 亿年后的谷歌搜索...

        label = pg.LabelItem("Error", size="36pt", color="FF0000")
        label.setParentItem(self.plotInstance)
        label.anchor(itemPos=(1,0), parentPos=(1,0), offset=(-10,10))

其中 self.plotInstance = pg.PlotWidget.getPlotItem()

适用于 PyQt5 和 pyqtgraph 0.12

【讨论】:

【参考方案2】:

现在这是一个有点老的问题 - 希望这会对某人有所帮助。回答这个问题帮助我回答了我自己的问题。

请注意,我使用的是 PySide2 而不是 PyQt4——我不认为这与 PyQt4 有很大不同。我也在使用 pyqtgraph 0.11.1。

LegendItem 有一个 getLabel() 方法,它返回给定 plotItem 的图例中的 LabelItem。这应该可以让你做你想做的事。

您使用以下代码创建了您的图例:

legend = graph2.addLegend()
style = pg.PlotDataItem(pen='w')
legend.addItem(style, 'A2')

然后您可以通过以下方式获取标签项:

legend_labelitem = legend.getLabel(style)

有了它,您应该能够更改属性 - 例如使用 .setText() 设置新的图例文本:

legend_labelitem.setText('Something else')

完整的代码最终会是这样的:

import pyqtgraph as pg 
# from PySide2 import QtGui  # <---- tested with this
from PyQt4 import QtGui 
import numpy as np 
import sys 
def main(): 
    app = QtGui.QApplication(sys.argv) 
    widg = QtGui.QWidget() 
    widg.move(100, 100) 
    pg.setConfigOption('background', 'w')
    pg.setConfigOption('foreground', 'k') 

    pgWidg = pg.GraphicsLayoutWidget()   
    pgWidg.resize(750, 250)  

    graph1 = pgWidg.addPlot(row=1, col=1) 
    graph2 = pgWidg.addPlot(row=1, col=2)
    curve1 = graph1.plot(y=np.sin(np.linspace(1, 21, 1000)), pen='k') 
    curve2 = graph2.plot(y=np.sin(np.linspace(1, 21, 1000)), pen='k') 

    graph1.addItem(curve1) 
    graph2.addItem(curve2) 
    graph1.setMouseEnabled(x=False, y=True)
    graph2.setMouseEnabled(x=False, y=True)

    graph1Text = pg.TextItem(text = 'A1', color=(0, 0, 0))
    graph1.addItem(graph1Text)
    graph1Text.setPos(150, 1)

    legend = graph2.addLegend()
    style = pg.PlotDataItem(pen='w')
    legend.addItem(style, 'A2')
    legend_labelitem = legend.getLabel(style)  # <---------
    legend_labelitem.setText('Something else')  # <---------

    grid = QtGui.QGridLayout() 
    grid.addWidget(pgWidg, 0,0)          
    widg.setLayout(grid) 
    widg.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()

它产生这个:

【讨论】:

以上是关于pyqtgraph:在缩放时保持 TextItem 的恒定位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqtgraph中缩放绘图

在 pyqtgraph 中的多个图上链接自动缩放

将y轴自动缩放到pyqtgraph中的可见数据

使用 pyQtGraph 在 pyqt graphicsView 中绘制图像

在不缩放或移动的 3d 图中绘制文本

缩放时保持 UIButton 相对