📅  最后修改于: 2023-12-03 15:33:55.413000             🧑  作者: Mango
PyQtGraph是一个用于Python的交互式图形和数据可视化库。它可以创建各种类型的图表,包括条形图。该库还提供了许多功能,例如巨大数据集的高性能渲染和数据的实时更新。
在这篇文章中,我们将探讨如何使用PyQtGraph创建条形图,并添加一个光标以显示数据点的值。这将使图表更具交互性,并允许用户更轻松地识别数据点的值。
在开始创建条形图之前,我们需要先安装PyQtGraph。可以使用pip安装该库,只需要在命令行中输入以下命令即可:
pip install pyqtgraph
首先,我们需要导入PyQtGraph和PyQt5:
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QMainWindow
接下来,我们创建一个QMainWindow
并使用pg.PlotWidget
作为中央窗口部件:
app = QApplication([])
window = QMainWindow()
plot_widget = pg.PlotWidget()
window.setCentralWidget(plot_widget)
window.show()
我们现在可以创建一个简单的条形图,该图将显示一些任意数据。在下面的示例中,我们使用pg.BarGraphItem
创建一个条形图,该图将显示三个数据点:
data = [("A", 1), ("B", 3), ("C", 2)]
bars = pg.BarGraphItem(x=[i for i in range(len(data))], height=[item[1] for item in data], width=0.6, brush='b')
plot_widget.addItem(bars)
最后,我们可以使用pg.AxisItem
添加X和Y轴标签:
x_axis = pg.AxisItem('bottom', showValues=True)
y_axis = pg.AxisItem('left', showValues=True)
plot_widget.getAxis('bottom').setLabel('X Label')
plot_widget.getAxis('left').setLabel('Y Label')
现在,我们已经创建了一个简单的条形图,并且可以看到每个数据点的高度已正确设置。
接下来,我们将添加一个光标到图表中。我们将使用pg.InfiniteLine
创建一个垂直线,该线将跟踪鼠标光标的位置。然后,我们将更新一个QLabel
以显示与数据点相对应的值:
cursor_label = pg.LabelItem(justify='right')
plot_widget.addItem(cursor_label)
v_line = pg.InfiniteLine(angle=90, movable=False)
plot_widget.addItem(v_line)
def move_cursor(event):
pos = event.pos()
if plot_widget.sceneBoundingRect().contains(pos):
mouse_point = plot_widget.plotItem.vb.mapSceneToView(pos)
index = int(mouse_point.x())
if 0 <= index < len(data):
x = index
y = data[index][1]
cursor_label.setText(f"<span style='font-size: 12pt'>x={x}, y={y}</span>")
v_line.setPos(x)
plot_widget.scene().sigMouseMoved.connect(move_cursor)
在这个示例中,我们首先创建了一个LabelItem
,用于显示与数据点相对应的值。我们还创建了一个垂直线,该线跟踪光标位置,并在与数据点对齐时显示。move_cursor
函数处理sigMouseMoved
信号,并计算数据点的位置。然后,它更新LabelItem
以显示数据值,并将垂直线位置设置为数据点的X坐标。
下面是添加光标之后的完整代码片段:
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QMainWindow
app = QApplication([])
window = QMainWindow()
plot_widget = pg.PlotWidget()
window.setCentralWidget(plot_widget)
data = [("A", 1), ("B", 3), ("C", 2)]
bars = pg.BarGraphItem(x=[i for i in range(len(data))], height=[item[1] for item in data], width=0.6, brush='b')
plot_widget.addItem(bars)
x_axis = pg.AxisItem('bottom', showValues=True)
y_axis = pg.AxisItem('left', showValues=True)
plot_widget.getAxis('bottom').setLabel('X Label')
plot_widget.getAxis('left').setLabel('Y Label')
cursor_label = pg.LabelItem(justify='right')
plot_widget.addItem(cursor_label)
v_line = pg.InfiniteLine(angle=90, movable=False)
plot_widget.addItem(v_line)
def move_cursor(event):
pos = event.pos()
if plot_widget.sceneBoundingRect().contains(pos):
mouse_point = plot_widget.plotItem.vb.mapSceneToView(pos)
index = int(mouse_point.x())
if 0 <= index < len(data):
x = index
y = data[index][1]
cursor_label.setText(f"<span style='font-size: 12pt'>x={x}, y={y}</span>")
v_line.setPos(x)
plot_widget.scene().sigMouseMoved.connect(move_cursor)
window.show()
app.exec_()
在这篇文章中,我们学习了如何使用PyQtGraph创建条形图,并添加一个光标以显示数据点的值。与典型的静态图表相比,交互式图表可以更好地向用户传递意义。这些方法可以帮助我们更好地探索我们的数据并更好地了解它们。