使用pyqt创建Barplot

问题描述

我需要用pyqtgraph绘制动画条形图。带有动画,我的意思是一张图表,该图表更新了由串行端口给定的值。目前,没有动画的情节就足够了。我想实现一个看起来像这样的情节:

horizontal barplot

我的输入数据以如下形式的字典给出:(Key = Timestamp,Value = Event)

{1604496095: 0,1604496096: 4,1604496097: 6,1604496098: 8,1604496099: 9,1604496100: 7,1604496101: 8 ... }

不幸的是,我无法提供很多代码,因为我无法创建类似于图中的图。到目前为止,我只有相应的窗口

那是我现在的窗口:

from PyQt5 import QtGui,QtWidgets,QtCore
import pyqtgraph as pg
import sys

class Plotter(QtWidgets.QMainWindow):
    def __init__(self,*args):
        QtWidgets.QMainWindow.__init__(self,*args)
        self.setwindowTitle("Test-Monitor")
        self.setMinimumSize(QtCore.QSize(800,400))
        self.setupUI()

    def setupUI(self):
        self.plot = pg.PlotWidget()
        self.plot.showGrid(x=True,y=True)
        self.plot.setLabel('left','Event')
        self.plot.setLabel('bottom','Time')

        self.setCentralWidget(self.plot)


app = QtWidgets.QApplication(sys.argv)
plotter = Plotter()
plotter.show()
app.exec_()

我希望看到一个使用与图片接近的pyqtgraph的代码示例。

解决方法

您可以使用BarGraphItem,并使用值数组添加所有“条形图”(或根据需要添加单个BarGraphItems):

    def buildData(self,data):
        stamps = sorted(data.keys())
        zero = min(stamps)
        x0 = []
        y0 = []
        width = []
        brushes = []
        for i,stamp in enumerate(stamps):
            try:
                nextStamp = stamps[i + 1]
            except:
                nextStamp = stamp + 1
            x0.append(stamp - zero)
            y0.append(data[stamp])
            width.append(nextStamp - stamp)
            brushes.append(QtGui.QColor(QtCore.Qt.GlobalColor(data[stamp])))

        barItem = pg.BarGraphItem(x0=x0,y0=y0,width=width,height=1,brushes=brushes)
        self.plot.addItem(barItem)

请注意,仅出于本示例的目的,使用Qt.GlobalColor选择画笔颜色,您可能应该使用字典或基于该值返回颜色的函数。