PyQtGraph实时绘图:添加随数据联动的右侧线标签可行吗?
在PyQtGraph中实现实时曲线末端附着标签
完全可行,你可以通过pyqtgraph.TextItem结合数据更新时的坐标转换来实现标签随曲线末端同步移动的效果。以下是可直接运行的参考示例:
import pyqtgraph as pg from pyqtgraph.Qt import QtCore, QtGui import numpy as np # 初始化应用 app = QtGui.QApplication([]) win = QtGui.QMainWindow() win.setWindowTitle("实时曲线末端标签示例") plot_widget = pg.PlotWidget() win.setCentralWidget(plot_widget) win.show() # 初始化数据 x = np.arange(0, 100) y1 = np.sin(x / 10) y2 = np.cos(x / 10) # 创建曲线 curve1 = plot_widget.plot(x, y1, pen='r', name='曲线1') curve2 = plot_widget.plot(x, y2, pen='b', name='曲线2') # 创建标签并添加到绘图区 label1 = pg.TextItem(text='曲线1', color='r') label2 = pg.TextItem(text='曲线2', color='b') plot_widget.addItem(label1) plot_widget.addItem(label2) def update_data(): global x, y1, y2 # 生成新数据点 new_x = x[-1] + 1 new_y1 = np.sin(new_x / 10) new_y2 = np.cos(new_x / 10) # 更新数据数组 x = np.append(x, new_x) y1 = np.append(y1, new_y1) y2 = np.append(y2, new_y2) # 限制数据长度,避免内存占用过大 if len(x) > 200: x = x[-200:] y1 = y1[-200:] y2 = y2[-200:] # 更新曲线数据 curve1.setData(x, y1) curve2.setData(x, y2) # 更新标签位置:将数据坐标转换为绘图区像素坐标,偏移到曲线右侧 view_box = plot_widget.getViewBox() # 曲线1标签位置 pos1 = view_box.mapFromData(x[-1], y1[-1]) label1.setPos(pos1.x() + 15, pos1.y()) # 曲线2标签位置 pos2 = view_box.mapFromData(x[-1], y2[-1]) label2.setPos(pos2.x() + 15, pos2.y()) # 设置定时器,每50ms更新一次数据 timer = QtCore.QTimer() timer.timeout.connect(update_data) timer.start(50) # 启动应用 if __name__ == '__main__': QtGui.QApplication.instance().exec_()
关键实现说明
- 标签创建:使用
pg.TextItem创建文本标签,支持自定义颜色、字体等样式; - 坐标转换:通过
ViewBox.mapFromData()将曲线末端的数据坐标转换为绘图区的像素坐标,确保标签位置与曲线数据同步; - 实时更新:在数据更新函数中,每次生成新数据后重新计算标签位置,通过定时器触发实时刷新。
如果需要更复杂的标签样式(如带背景框、连接线),可以继承pg.GraphicsObject自定义标签组件,基础的跟随移动需求上述代码完全满足。
备选库方案(若PyQtGraph无法满足特殊需求)
- Matplotlib:通过
annotate函数结合实时更新回调,可实现类似效果,但实时绘制性能略低于PyQtGraph; - Bokeh:适合Web端实时可视化,通过自定义标注组件实现跟随标签,但需要基于Web环境运行。
内容的提问来源于stack exchange,提问作者Qosa
相关产品推荐
相关产品推荐

