【问题标题】:pyqtgraph scatterplotitem setbrushpyqtgraph scatterplotitem setbrush
【发布时间】:2017-04-24 22:00:39
【问题描述】:

我正在尝试通过 setBrush 传递列表参数。

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

app = QtGui.QApplication([])
mw = QtGui.QMainWindow()
mw.resize(800,800)
view = pg.GraphicsLayoutWidget()  
mw.setCentralWidget(view)
mw.setWindowTitle('pyqtgraph example: ScatterPlot')
w1 = view.addPlot()
x = [1,2,3,4,5,6,7,8,9,10]
y = [10,8,6,4,2,20,18,16,14,12]
s1 = pg.ScatterPlotItem(x,y,size=10, pen=pg.mkPen(None), brush=pg.mkBrush(255, 255, 255, 120))
s1.setBrush(['r']*10, mask=None)
w1.addItem(s1)
mw.show()

当我运行此代码时,我收到如下错误:

Traceback(最近一次调用最后一次):文件“”,第 1 行,在

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 467 行,在 setBrush 中 self.updateSpots(dataSet)

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 553 行,在 updateSpots 中 self.fragmentAtlas.getAtlas() # 生成图集,以便源宽度可用。

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 193 行,在 getAtlas 中 self.buildAtlas()

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 143 行,在 buildAtlas 中 img = renderSymbol(key[0], key[1], sourceRect.pen, sourceRect.brush)

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 74 行,在 renderSymbol 中 drawSymbol(p, 符号, 大小, 笔, 画笔)

文件 "C:\Python34\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", 第 49 行,在 drawSymbol 中 painter.setBrush(brush) TypeError: arguments did not match any overloaded call: QPainter.setBrush(QBrush): argument 1 has 意外类型 'str' QPainter.setBrush(Qt.BrushStyle):参数 1 有意外的类型“str”

如何通过 setBrush 传递列表?我必须为不同的点分配不同的颜色。

【问题讨论】:

    标签: python pyqtgraph


    【解决方案1】:

    如果要更改点的颜色,可以将列表传递给symbolBrush 关键字。你的代码就变成了:

    from pyqtgraph.Qt import QtGui, QtCore
    import pyqtgraph as pg
    import numpy as np
    import time
    import sys
    
    app = QtGui.QApplication([])
    mw = QtGui.QMainWindow()
    mw.resize(800,800)
    view = pg.GraphicsLayoutWidget()
    mw.setCentralWidget(view)
    mw.setWindowTitle('pyqtgraph example: ScatterPlot')
    w1 = view.addPlot()
    x = [1,2,3,4,5,6,7,8,9,10]
    y = [10,8,6,4,2,20,18,16,14,12]
    
    brush_list = [pg.mkColor(c) for c in "rgbcmykwrg"]
    
    p1 = w1.plot()
    s1 = p1.setData(x=x, y=y, size=10, pen=pg.mkPen(None), brush='g', symbol='o', symbolBrush=brush_list, symbolPen='r')
    mw.show()
    sys.exit(QtGui.QApplication.exec_())
    

    我需要做 p1 = w1.plot() 才能让它工作,但我对所有 pyqtgraph 对象都不够流利,无法告诉你它是做什么的。

    我必须将颜色字符串(或元组或其他)转换为 pg.mkColor() 对象才能工作(尽管文档说不需要)

    请注意,brush 关键字会填充图形直到您指定的某个值(例如 x 轴),这对于线很有用,但对于点不显示任何内容,如图所示。

    symbolPen 关键字可用于点的线条颜色。

    【讨论】:

      【解决方案2】:

      添加s.setBrush(QtGui.QBrush({your parameters})) 举例:

      • QtGui.QBrush()
      • QtGui.QBrush(Qt.BrushStyle bs)
      • QtGui.QBrush(QColor color, Qt.BrushStyle style = Qt.SolidPattern)
      • QtGui.QBrush(Qt.GlobalColor color, Qt.BrushStyle style = Qt.SolidPattern)
      • QtGui.QBrush(QColor color, QPixmap pixmap)
      • QtGui.QBrush(Qt.GlobalColor color, QPixmap pixmap)
      • QtGui.QBrush(QPixmap pixmap)
      • QtGui.QBrush(QImage 图像)
      • QtGui.QBrush(QGradient 渐变)
      • QtGui.QBrush(QBrush画笔)
      • QtGui.QBrush(QVariant 变体)

      在您的代码中:

      import sys
      from pyqtgraph.Qt import QtGui, QtCore
      import pyqtgraph as pg
      import numpy as np
      
      app = QtGui.QApplication(sys.argv)
      mw = QtGui.QMainWindow()
      mw.resize(800, 800)
      view = pg.GraphicsLayoutWidget()
      mw.setCentralWidget(view)
      mw.setWindowTitle('pyqtgraph example: ScatterPlot')
      w1 = view.addPlot()
      x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      y = [10, 8, 6, 4, 2, 20, 18, 16, 14, 12]
      
      # Create seed for the random
      time = QtCore.QTime.currentTime()
      QtCore.qsrand(time.msec())
      
      for i in range(len(x)):
          s = pg.ScatterPlotItem([x[i]], [y[i]], size=10, pen=pg.mkPen(None))  # brush=pg.mkBrush(255, 255, 255, 120))
          s.setBrush(QtGui.QBrush(QtGui.QColor(QtCore.qrand() % 256, QtCore.qrand() % 256, QtCore.qrand() % 256)))
          w1.addItem(s)
      mw.show()
      sys.exit(QtGui.QApplication.exec_())
      

      输出:

      如果要将前 5 个点 (x: 1-5) 设置为红色,将另外 5 个点设置为蓝色 (x: 6-10)

      import sys
      from pyqtgraph.Qt import QtGui
      import pyqtgraph as pg
      
      app = QtGui.QApplication(sys.argv)
      mw = QtGui.QMainWindow()
      mw.resize(800, 800)
      view = pg.GraphicsLayoutWidget()
      mw.setCentralWidget(view)
      mw.setWindowTitle('pyqtgraph example: ScatterPlot')
      w1 = view.addPlot()
      x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      y = [10, 8, 6, 4, 2, 20, 18, 16, 14, 12]
      
      color = QtGui.QColor("#0000FF")
      s = pg.ScatterPlotItem(x[:5], y[:5], size=10, pen=pg.mkPen(None), brush='r')
      w1.addItem(s)
      s = pg.ScatterPlotItem(x[5:], y[5:], size=10, pen=pg.mkPen(None), brush='b')
      w1.addItem(s)
      mw.show()
      sys.exit(QtGui.QApplication.exec_())
      

      【讨论】:

      • 非常感谢 :) 我可以将前 5 点 (x : 1-5) 刷成红色,再设置 5 点 (x: 6-10) 刷成蓝色吗?
      • @eyllanesc 你能帮帮我吗,我需要 x 轴上的时间戳。我的 x 值为 x = ['0:09:43', '0:09:44', '0:09:45', '0:09:46', '0:09:47', '0: 09:48'、'0:09:49'、'0:09:50'、'0:09:51'、'0:09:52'、'0:09:53'、'0:09: 54'、'0:09:55'、'0:09:56'、'0:09:57']
      猜你喜欢
      • 2017-02-14
      • 2022-08-03
      • 2020-03-04
      • 2021-05-18
      • 2015-11-03
      • 2017-06-30
      • 2015-02-13
      • 2013-08-14
      • 2018-05-20
      相关资源
      最近更新 更多