【问题标题】:How to enable legends and change style in pyqtgraph?如何在 pyqtgraph 中启用图例和更改样式?
【发布时间】:2019-11-17 00:34:19
【问题描述】:

使用 pyQt5,我使用 self.graphicsView.clear() 和 self.graphicsView.plot() 函数不断更新带有数据的绘图。

我在创建小部件之前使用命令 pyqtgraph.setConfigOption('background', '#f0f0f0') 更改了背景颜色,但这不适用于图例项。背景为灰色,图例显示为黑色。

如何更改此图例项的样式?

我认为我根据我如何引用每个新的情节项目来实施这个错误。我相信这些需要以某种方式实例化,但是 instance = self.graphicsView.plot(title = "example title") 然后用 instance.LegendItem 引用,然后用 HTML 之类的标签访问它。 (找不到参考了)

def plotGraph(self, value):
    """
    plots value to graph
    """
    self.graphQueue(self.plotDataBuffer, value)                   #buffered data input, max vals = value
    self.graphicsView.clear()                                     #clear data for continuous plot
    self.graphicsView.addLegend()
    self.graphicsView.plot(self.plotDataBuffer, pen='r', name='Data')   #plot item

注意:这个函数是循环调用的

addLengend() 命令每次调用都会创建一个新的图例,但是,我的理解是这只会创建一次,如果再次调用它只会引用已经创建的图例?

那么,我如何正确初始化图例一次,然后格式化样式以匹配背景而不是黑色?

简化示例:

import pyqtgraph as pg
from PyQt5 import QtGui
import numpy as np
import sys

pg.setConfigOption('background', '#f0f0f0')

plotWidget = pg.plot(title="Stackoverflow Simplified Example")

app = QtGui.QApplication(sys.argv)

while(1):
    x = np.arange(50)
    y = np.random.normal(size=(3, 50))
    plotWidget.clear()
    plotWidget.addLegend()
    for i in range(3):
        plotWidget.plot(x, y[i], pen=(i,3), name = "test {}".format(i))
    app.processEvents()

if __name__ == '__main__':
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        app.exec_()  # Start QApplication event loop ***

【问题讨论】:

标签: python python-3.x pyqt pyqt5 pyqtgraph


【解决方案1】:

检查 pyqtgraph LegendItem.py,我们会发现颜色被硬编码到绘图函数中。您可以将该函数替换为用户定义的函数并更改颜色。

import pyqtgraph as pg
from PyQt5 import QtGui
import numpy as np
import sys
import types
pg.setConfigOption('background', '#f0f0f0')

plotWidget = pg.plot(title="Stackoverflow Simplified Example")

app = QtGui.QApplication(sys.argv)
leg = plotWidget.addLegend()

# replace legend paint
def paint(self, p, *args):
   p.setPen(pg.mkPen(255,0,0,100))
   p.setBrush(pg.mkBrush(0,200,0,50))
   p.drawRect(self.boundingRect())
leg.paint = types.MethodType(paint,leg)

plotData = [0]*3
for i in range(3):
   plotData[i] =plotWidget.plot([0],[0], pen=(i,3), name = "test {}".format(i))

while(1):
    x = np.arange(50)
    y = np.random.normal(size=(3, 50))
    for i in range(3):
      plotData[i].setData(x, y[i])
    app.processEvents()

if __name__ == '__main__':
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        app.exec_()  # Start QApplication event loop ***


【讨论】:

    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2014-05-18
    • 2017-01-05
    • 2021-03-31
    • 2021-07-18
    相关资源
    最近更新 更多