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

如何为DataFrame绘图中的两类垂直虚线添加图例?

为Matplotlib中的垂直虚线添加图例的解决方案

你的代码目前存在的问题是:循环绘制垂直虚线时,每次都添加了相同的label参数,这会导致图例中出现大量重复的条目,无法正确展示两类虚线的图例。以下是两种可行的解决方法:

方法一:仅在第一次绘制时添加标签

通过遍历索引判断,只在第一次绘制对应颜色的虚线时设置label,后续绘制时将label设为None,最后统一调用legend()展示所有图例:

ax = df.plot(title=title, fontsize=12, color=["tab:purple", "tab:red"])
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)

# 绘制蓝色长入场点虚线,仅第一次添加标签
for idx, xc in enumerate(blue_x_coords):
    line_label = "Long Entry points" if idx == 0 else None
    ax.axvline(x=xc, color="blue", linestyle="dashed", label=line_label)

# 绘制黑色短入场点虚线,仅第一次添加标签
for idx, xc in enumerate(black_x_coords):
    line_label = "Short Entry points" if idx == 0 else None
    ax.axvline(x=xc, color="black", linestyle="dashed", label=line_label)

# 显示整合后的图例
ax.legend()

plt.savefig("./images/" + filename)
plt.clf()

方法二:手动创建图例条目

如果需要更灵活地控制图例内容,可以先绘制所有虚线(不设置label),再手动创建图例线对象,和原有DataFrame的图例条目合并后展示:

ax = df.plot(title=title, fontsize=12, color=["tab:purple", "tab:red"])
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)

# 批量绘制蓝色虚线,不设置标签
for xc in blue_x_coords:
    ax.axvline(x=xc, color="blue", linestyle="dashed")

# 批量绘制黑色虚线,不设置标签
for xc in black_x_coords:
    ax.axvline(x=xc, color="black", linestyle="dashed")

# 获取DataFrame绘图生成的原有图例条目
handles, labels = ax.get_legend_handles_labels()

# 手动创建垂直虚线的图例线对象
from matplotlib.lines import Line2D
long_entry_line = Line2D([], [], color="blue", linestyle="dashed", label="Long Entry points")
short_entry_line = Line2D([], [], color="black", linestyle="dashed", label="Short Entry points")

# 合并原有条目与自定义条目
handles.extend([long_entry_line, short_entry_line])
labels.extend(["Long Entry points", "Short Entry points"])

# 设置并显示图例
ax.legend(handles=handles, labels=labels)

plt.savefig("./images/" + filename)
plt.clf()

两种方法都能实现需求:方法一更简洁,适合简单场景;方法二更灵活,适合需要自定义图例样式或整合多种元素的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:48:18