You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQtGraph是否支持类似Matplotlib markevery的部分点标记功能?

PyQtGraph实现类似Matplotlib的markevery效果

好问题!PyQtGraph确实没有像Matplotlib那样直接提供markevery关键字参数,但我们完全不需要通过两次调用plot来标记部分点——用符号样式的序列控制就能实现同样的效果,而且只需要一次绘图调用。

方法一:用symbolBrush/symbolPen序列指定要标记的点

PyQtGraph的plot函数允许给symbolBrush、symbolPen这类参数传入和数据长度匹配的序列(列表或numpy数组)。我们可以把不需要标记的点的画笔/画刷设为None,只在目标索引位置设置有效的样式,这样就只会渲染指定的点标记。

举个实际的例子,比如我们想每10个点标记一次:

import pyqtgraph as pg
import numpy as np

# 生成大数据集
x = np.linspace(0, 10, 151)
y = x**2

# 定义要标记的点的索引(每10个点取一个)
mark_step = 10
mark_indices = np.arange(0, len(x), mark_step)

# 创建画刷序列:默认None(不显示标记),仅在目标索引设置红色画刷
symbol_brush = np.full(len(x), None, dtype=object)
symbol_brush[mark_indices] = pg.mkBrush('red')

# 创建画笔序列:目标索引设置黑色边框
symbol_pen = np.full(len(x), None, dtype=object)
symbol_pen[mark_indices] = pg.mkPen('black')

# 一次调用plot,同时绘制曲线和指定标记点
pg.plot(x, y, symbol='o', symbolBrush=symbol_brush, symbolPen=symbol_pen)

这种方式的优势是:

  • 无需拆分数据或多次调用绘图函数,代码更简洁
  • 对大数据集友好,numpy索引操作效率很高
  • 可以灵活控制每个标记点的样式(比如不同颜色、大小,只要把序列里的元素换成对应的样式即可)

方法二:组合PlotCurveItem和ScatterPlotItem(可选)

如果需要更精细的控制(比如标记点的大小随数据变化),也可以分别创建曲线和散点标记,然后添加到同一个绘图窗口中:

import pyqtgraph as pg
import numpy as np

x = np.linspace(0, 10, 151)
y = x**2

# 创建绘图窗口
win = pg.GraphicsLayoutWidget()
plot = win.addPlot()

# 绘制完整曲线
plot.plot(x, y)

# 提取要标记的子集数据
mark_step = 10
mark_x = x[::mark_step]
mark_y = y[::mark_step]

# 添加散点标记
plot.plot(mark_x, mark_y, symbol='o', symbolBrush='red', symbolPen='black', pen=None)

win.show()

不过这种方法确实需要两次绘图调用,适合需要单独控制曲线和标记样式的场景,但第一种方法已经能满足绝大多数类似markevery的需求。

对比Matplotlib的markevery

本质上,两种库实现“部分点标记”的思路是相通的:Matplotlib的markevery帮你封装了“选择标记点”的逻辑,而PyQtGraph则让你直接控制每个点的显示状态,灵活性更高,写法也不算复杂。

内容的提问来源于stack exchange,提问作者EL_DON

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:28:15