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

