使用 pyqt 创建条形图

Posted

技术标签:

【中文标题】使用 pyqt 创建条形图【英文标题】:Creating a Barplot using pyqt 【发布时间】:2021-02-19 12:48:01 【问题描述】:

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

我的输入数据在字典中给出,如下所示:(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 的代码示例。

【问题讨论】:

【参考方案1】:

您可以使用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 选择画笔颜色只是为了本示例的目的,您可能应该使用字典或根据值返回颜色的函数。

【讨论】:

完美运行,谢谢。我还有一个问题,也许你可以帮助我。我想在图旁边制作一个复选框列表,我想将其连接到图中的条形图。我是否必须为每个单个值创建一个 pg.BarGraphItem 以显示或隐藏它们,或者这可以通过给定的解决方案实现吗? 我不确定我是否理解。您希望能够单独显示/隐藏条形吗?如果是这种情况,是的,您必须创建单个项目,这是由于这些项目的绘制方式(它们实际上是 QPicture 实例)。 是的,这正是我想做的。你有什么好的方法可以让我为每个单独的任务(Y)创建一个栏吗? 我相信您可以使用以下参数创建单独的柱:BarGraphItem(x0=[x], y0=y, width=width, height=1, brushes=[brush]);请注意,在这种情况下,变量是每个条形图(而不是列表)的单独值,但 x0 和画笔参数必须是该类的数组,这就是它们括在方括号中的原因。 @enyo 请注意,如果您不需要特定的交互,您甚至可以使用简单的 QGraphicsRectItem。

以上是关于使用 pyqt 创建条形图的主要内容,如果未能解决你的问题,请参考以下文章

窗口大小更改导致我的条形图覆盖 - Matplotlib

使用二进制数据创建条形图

R语言 条形图

使用 ggplot2 创建条形图并按多个值拆分条形?

使用 pandas 交叉表创建条形图

使用 python dict 使用 Plotly express 创建条形图