it编程 > 编程语言 > C/C++

PyQtGraph中的PlotWidget基本使用和代码示例

17人参与 2026-01-25 C/C++

pyqtgraph中的plotwidget详解

前言

plotwidget 确实是 pyqtgraph 库的基石,它提供了一个开箱即用、功能强大的绘图区域。为了帮你快速构建起对它的整体认知,下面这个表格汇总了其核心特性和在pyqtgraph类体系中的定位。

特性维度说明
核心定位一个高级的、即用型的图表控件,封装了完整的图表组件(坐标轴、标题、图例等),易于嵌入pyqt/pyside应用程序。
继承关系继承自 qtwidgets.qgraphicsview,因此可以像标准qt控件一样使用。
内部核心内部包含一个 plotitem对象,真正负责管理图表内容(数据曲线、坐标轴等)。plotwidget的许多方法直接调用其内部 plotitem的对应方法。
主要优势开箱即用:无需手动搭建复杂场景;性能优异:尤其适合需要快速绘制大量数据或实时更新的场景。

核心架构与协作

plotwidget的强大在于其内部精密的协作关系,下图直观地展示了其核心构成及数据流转路径:

正如流程图所示,plotwidget内部包含一个 plotitem作为图表的“大脑”。plotitem则管理着 viewbox(负责显示数据和处理交互)、坐标轴(axisitem)和标签等组件。通过 plotwidgetplot()方法添加数据时,它会创建 plotdataitem等对象并在 viewbox中渲染 。

基本使用与样式定制

基本的使用流程非常直接,同时允许进行丰富的样式定制。

创建与数据绘制

import pyqtgraph as pg
from pyqt5.qtwidgets import qapplication
import numpy as np
import sys
app = qapplication(sys.argv)
plot_widget = pg.plotwidget(title="基础示例") # 设置图表标题
# 准备并绘制数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
plot_widget.plot(x, y, pen='b', name='正弦波') # 绘制一条蓝色曲线,并命名
plot_widget.show()
sys.exit(app.exec_())

背景与网格

plot_widget.setbackground('w')  # 设置背景为白色
plot_widget.showgrid(x=true, y=true, alpha=0.3)  # 显示网格并设置透明度

坐标轴与标题

plot_widget.setlabel('left', '幅度', units='v') # 设置坐标轴标签
plot_widget.setlabel('bottom', '时间', units='s')
plot_widget.settitle("信号波形图", color='b', size='14pt') # 设置图表标题

线条与数据点:通过 pen(线条)、symbol(标记点)、symbolbrush(标记填充色)等参数自定义 。

# 绘制带红色圆形标记的实线
plot_widget.plot(x, y, pen='b', symbol='o', symbolsize=5, symbolbrush='r')

效果如图:

plotwidget常用属性、函数、信号

下面这个表格汇总了 plotwidget 最常用的属性、函数和信号。

类别名称功能描述常用参数/值
常用属性background设置图表区域的背景颜色。颜色字符串(如 'w'代表白色)、十六进制值(如 '#ffffff')、rgb/a元组或 qcolor对象。
antialiasing控制是否开启抗锯齿,使线条和文本边缘更平滑。布尔值(truefalse),开启可能会轻微影响性能。
interactive设置绘图区域是否允许用户交互(如鼠标缩放、拖拽)。布尔值(truefalse)。
核心函数plot()在图表上绘制曲线或散点图。x, y(数据), pen(线条), symbol(数据点标记), name(图例名称)等。
setlabel()设置坐标轴的标签(标题)。axis(轴,如 'left', 'bottom'), text(标签文本), units(单位,可选)。
setxrange()/ setyrange()设置x轴或y轴的显示范围。min(最小值), max(最大值), padding(边距,通常设为0以精确控制)。
showgrid()显示或隐藏背景网格线。x(x轴网格), y(y轴网格), alpha(网格线透明度)。
addlegend()在图表上添加图例,需要与 plot()函数中的 name参数配合使用。无参数或通过 offset参数设置图例位置。
clear()清除图表上所有的绘图项。无参数。
重要信号sigxrangechanged当x轴的显示范围发生变化时(例如用户通过鼠标缩放或拖拽)发出此信号。
sigyrangechanged当y轴的显示范围发生变化时发出此信号。

核心功能详解与代码示例

下面我们结合具体代码,进一步了解这些功能如何协同工作。

基本图表设置与绘制

下面的代码展示了如何创建一个基本的图表,包括设置背景、标题、坐标轴标签和网格。

import pyqtgraph as pg
from pyqt5.qtwidgets import qapplication
import sys
import numpy as np
app = qapplication(sys.argv)
# 创建plotwidget
plot_widget = pg.plotwidget()
# 设置背景为白色
plot_widget.setbackground('w')
# 设置图表标题
plot_widget.settitle("温度变化曲线", color='b', size='14pt')
# 设置坐标轴标签
plot_widget.setlabel('left', '温度', '°c')
plot_widget.setlabel('bottom', '时间', 's')
# 显示网格
plot_widget.showgrid(x=true, y=true, alpha=0.3)
# 生成示例数据并绘图
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制一条红色、带圆形标记的曲线,并命名为“示例曲线”
plot_widget.plot(x, y, pen='r', symbol='o', symbolsize=5, name='示例曲线')
# 添加图例
plot_widget.addlegend()
plot_widget.show()
sys.exit(app.exec_())

视图控制与交互

通过设置视图范围和使用信号,可以实现图表的自动缩放或联动。

# 将x轴范围锁定在0到5,y轴范围锁定在-1.5到1.5,并且不留边距(padding=0)
plot_widget.setxrange(0, 5, padding=0)
plot_widget.setyrange(-1.5, 1.5, padding=0)
# 连接信号,当视图范围改变时在控制台打印新范围
def on_x_range_changed(view, range_tuple):
   print(f"x轴范围变为: {range_tuple}")
plot_widget.sigxrangechanged.connect(on_x_range_changed)

动态数据更新

对于实时数据展示,高效的方法是更新已有数据项,而非清除重绘。

# 初始绘制一条空曲线,并保存其引用
curve = plot_widget.plot(pen='b')
# 初始化数据容器
data_x = []
data_y = []
# 模拟数据更新函数
def update_data(new_value):
   data_x.append(len(data_x))  # 假设x轴是数据点索引
   data_y.append(new_value)
   # 高效更新曲线数据
   curve.setdata(data_x, data_y)

效果如图:

实用技巧与进阶概念

掌握了基本操作后,了解一些进阶概念和技巧能让你的图表更出色。

理解底层架构plotwidget是一个高级封装,其内部核心是一个 plotitem,而 plotitem又包含一个负责实际显示和交互的 viewbox。当你调用 plot_widget.plot()时,实际上是在其内部的 plotitem上操作。这种设计使得 plotwidget既易用又强大。

线条与标记样式:通过 pg.mkpen()pg.mkbrush()可以创建更复杂的线条和填充样式。

# 创建自定义的笔(pen):蓝色、2像素宽、虚线
custom_pen = pg.mkpen(color='b', width=2, style=pg.qtcore.qt.dashline)
# 创建自定义的画刷(brush):绿色填充
custom_brush = pg.mkbrush('g')
plot_widget.plot(x, y, pen=custom_pen, symbol='s', symbolbrush=custom_brush)

多图表布局:如果需要在一个窗口中排列多个图表,可以使用 graphicslayoutwidget,它类似于一个网格布局,可以轻松地添加和管理多个 plotitem

layout_widget = pg.graphicslayoutwidget()
plot1 = layout_widget.addplot(row=0, col=0, title="图表1")
plot2 = layout_widget.addplot(row=0, col=1, title="图表2")
plot3 = layout_widget.addplot(row=1, col=0, colspan=2, title="图表3") # 合并两列

高级功能与应用

实时数据更新:这是pyqtgraph的强项。正确做法是更新已有数据项,而非重绘 。

# 初始化时获取曲线引用
self.curve = plot_widget.plot(pen='y')
# ... 数据更新逻辑
new_y = np.sin(new_x)
self.curve.setdata(new_x, new_y) # 高效更新数据

鼠标交互与事件:默认支持缩放和平移。还可以连接鼠标事件实现点击添加点等高级交互 。

# 连接鼠标点击事件示例
def on_click(event):
    pos = event.scenepos()
    # 将场景坐标转换为数据坐标...
plot_widget.scene().sigmouseclicked.connect(on_click)

实用技巧

扩展

plotwidget是如何体现graphicsview、graphicsscene、graphicsitem这三个核心组件交互的

plotwidget 的精妙之处在于,它作为一个高度集成的高级组件,将 qt graphics view 框架中三个核心组件——graphicsview(视图)、graphicsscene(场景)和 graphicsitem(图元)的复杂交互封装了起来,为我们提供了一个开箱即用、功能强大的绘图界面。

为了更直观地理解这三者是如何在 plotwidget 内部协同工作的,我们可以参考下面的协作流程图:

下面我们来详细解读这个协作过程。

核心交互流程

1. 视图(graphicsview):交互的窗口

plotwidget 本身继承自 graphicsview,它充当了观察窗口的角色。

2. 场景(graphicsscene):图元的舞台

plotwidget 内部自动创建并管理着一个 plotitem(它本身是一种特殊的 graphicsitem),而 plotitem又包含一个 viewbox和一个默认的 graphicsscene

3. 图元(graphicsitem):真正的内容

在场景中显示的每一个独立元素都是一个图元。

协作实例:一次鼠标点击的旅程

假设你在 plotwidget 的曲线图上点击了一下鼠标,这个过程清晰地展示了三者的协作:

开发者视角的简化

对于我们开发者而言,plotwidget 的伟大之处在于它将底层交互封装成了简单的 api。在绝大多数情况下,你不需要直接操作 graphicsscene或底层的 graphicsitem

总结

简单来说,plotwidget 是一个“导演”,它搭建了一个完整的演出舞台(整合了 scene 和 view),并提供了丰富的“剧本”(api)。而我们开发者就像“制片人”,只需要下达指令(“在这里画一条正弦曲线”),导演就会指挥演员(graphicsitem)在舞台上的正确位置进行表演,并处理好观众(用户)与演员之间的所有互动。

希望这些介绍能帮助你更好地理解和使用 plotwidget。它是一个在功能、易用性和性能之间取得了出色平衡的工具,非常适合用于构建交互式科学计算应用程序的图形界面。

到此这篇关于pyqtgraph中的plotwidget基本使用和代码示例的文章就介绍到这了,更多相关pyqtgraph plotwidget使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C++ private、protected、public从入门到精通实例解析

01-23

浅谈C++ 中的常见的动态内存问题

01-23

C++ auto和decltype的用法和区别全解析

01-22

C++ 容器的两把利器之优先级队列与反向迭代器实现原理解析

01-26

C++中new关键字用法示例详解

01-27

C++ 中同名函数的实现原理与使用(函数重载)

01-21

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论