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
相关产品推荐
相关产品推荐

