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

Matplotlib同一图例中为不同线条单独设置numpoints参数方法

实现方法

Matplotlib 全局传入legend()的numpoints参数会对所有图例项生效,没有直接的单图例项配置参数,你提到的多图例组合方案完全可用,另外也可以通过修改图例实例属性实现需求,两种方法如下:

方法一:多图例叠加实现(最稳定)

将需要不同numpoints配置的曲线拆分,分别生成图例后叠加在同一位置即可,注意第一次生成的图例需要手动添加到坐标轴,否则会被第二次生成的图例覆盖。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 0.25 * np.pi, 200)
# 接收plot返回的线条对象,方便后续指定图例关联的元素
line_sin, = plt.plot(x, np.sin(x), label="sin", marker="x", markevery=12, c='k')
line_cos, = plt.plot(x, np.cos(x), label="cos", marker=".", markersize=1, lw=0, c='k')
line_tan, = plt.plot(x, np.tan(x), label="tan", ls="-.", c='k')

ax = plt.gca()
# 先为sin、tan生成numpoints=1的图例
leg_sin_tan = ax.legend(handles=[line_sin, line_tan], numpoints=1, loc="upper right")
# 手动添加第一个图例到坐标轴,避免被覆盖
ax.add_artist(leg_sin_tan)
# 单独为cos生成numpoints=8的图例,和前一个图例放在同一位置
ax.legend(handles=[line_cos], numpoints=8, loc="upper right")

plt.show()

运行后视觉上和单个图例无差异,各曲线的图例标记点数可独立设置。

方法二:修改单图例项属性

生成全局图例后,遍历找到cos对应的图例句柄,单独修改它的numpoints属性即可,不需要拆分多图例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 0.25 * np.pi, 200)
plt.plot(x, np.sin(x), label="sin", marker="x", markevery=12, c='k')
plt.plot(x, np.cos(x), label="cos", marker=".", markersize=1, lw=0, c='k')
plt.plot(x, np.tan(x), label="tan", ls="-.", c='k')

ax = plt.gca()
# 全局先设置numpoints=1
leg = ax.legend(numpoints=1)
# 遍历图例项找到cos条目
for handle, label_text in zip(leg.legend_handles, leg.get_texts()):
    if label_text.get_text() == "cos":
        handle.set_numpoints(8)

plt.show()

注意:3.7之前的Matplotlib版本中,图例句柄属性名为legendHandles,如果运行报属性不存在,替换成对应旧属性名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:15:42