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

