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

Matplotlib如何仅基于线型生成黑色图例,而非依赖颜色?

如何让Matplotlib图例仅展示线型差异且统一为黑色

我在同一张图中绘制两种算法(A1、A2)的两个指标(GC、DF)的数据,采用不同线型区分算法,不同颜色区分指标。当前生成的图例带有颜色,但我希望图例为黑色且仅展示线型差异。我的代码如下:

#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
x = np.arange(0,4)
fig, ax1 = plt.subplots(frameon=False)
d_gc = np.array([1.718,1.742,1.778,1.0])
q_gc = np.array([1.709,1.737,1.761,0.98])
p1 = ax1.plot(x,d_gc,'bs--',label='A1')
p2 = ax1.plot(x,q_gc,'bs:',label='A2')
ax1.set_ylabel('GC',color='b',size=13)
ax1.set_ylim([0.9,2])
ax2 = ax1.twinx()
d_df = np.array([1.00, 1.958, 1.982, 1.995])
q_df = np.array([0.97, 1.930, 1.973, 1.994])
ax2.plot(x,d_df,'cv--')
ax2.plot(x,q_df,'cv:')
ax2.set_ylabel('DF',color='c',size=13)
ax2.set_ylim([0.9,2])
ax1.xaxis.set_minor_locator(MaxNLocator(20))
ax1.grid(which='minor', alpha=0.25)
ax1.grid(which='major', alpha=0.5)
p = p1 + p2
labs = [l.get_label() for l in p]
lgd = ax1.legend(p, labs, bbox_to_anchor=(1.0,0.22),loc=0, ncol = 2, fontsize='11',shadow=True,fancybox=True)
fig.savefig('plot.pdf',format='pdf',transparent=True, bbox_extra_artists=(lgd,), bbox_inches='tight')

当然可以通过legend()函数的相关设置实现这个需求,核心思路是让图例条目统一使用黑色,仅保留线型的差异。这里有两种可靠的实现方式:

方式一:创建自定义图例条目(更可控)

手动生成仅包含黑色和目标线型的图例条目,完全替代原有绘图返回的handle,这样图例只会展示线型差异,颜色统一为黑色。

修改后的完整代码如下:

#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib.lines import Line2D  # 导入Line2D用于自定义图例

x = np.arange(0,4)
fig, ax1 = plt.subplots(frameon=False)
d_gc = np.array([1.718,1.742,1.778,1.0])
q_gc = np.array([1.709,1.737,1.761,0.98])
# 移除绘图时的label参数,后续用自定义图例
p1 = ax1.plot(x,d_gc,'bs--')
p2 = ax1.plot(x,q_gc,'bs:')
ax1.set_ylabel('GC',color='b',size=13)
ax1.set_ylim([0.9,2])
ax2 = ax1.twinx()
d_df = np.array([1.00, 1.958, 1.982, 1.995])
q_df = np.array([0.97, 1.930, 1.973, 1.994])
ax2.plot(x,d_df,'cv--')
ax2.plot(x,q_df,'cv:')
ax2.set_ylabel('DF',color='c',size=13)
ax2.set_ylim([0.9,2])
ax1.xaxis.set_minor_locator(MaxNLocator(20))
ax1.grid(which='minor', alpha=0.25)
ax1.grid(which='major', alpha=0.5)

# 创建自定义图例条目:统一黑色,仅保留线型和标记差异
custom_handles = [
    Line2D([], [], color='black', linestyle='--', marker='s', label='A1'),
    Line2D([], [], color='black', linestyle=':', marker='s', label='A2')
]
# 使用自定义条目生成图例
lgd = ax1.legend(handles=custom_handles, bbox_to_anchor=(1.0,0.22), loc=0, ncol=2, fontsize='11', shadow=True, fancybox=True)

fig.savefig('plot.pdf',format='pdf',transparent=True, bbox_extra_artists=(lgd,), bbox_inches='tight')

方式二:修改现有图例的颜色(更快捷)

如果不想重新创建图例条目,也可以在生成图例后,遍历每个图例元素并修改其颜色为黑色:

在原有代码的图例生成后添加这段代码:

# 遍历图例中的所有线条,设置为黑色
for handle in lgd.get_lines():
    handle.set_color('black')

这种方式会保留原有标记的形状,只统一修改颜色,适合快速调整的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:52:34