matplotlib 图例仅基于线条样式而不是颜色

Posted

技术标签:

【中文标题】matplotlib 图例仅基于线条样式而不是颜色【英文标题】:matplotlib legend based only on line style but not color 【发布时间】:2020-08-01 23:38:55 【问题描述】:

我在一个图中以不同的样式和颜色为两种不同的算法绘制两个指标的值。 我对不同的算法使用不同的风格,对不同的指标使用不同的颜色。 我希望图例仅基于线条样式。

我的代码是

#!/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')

在上面的图例中带有不同的颜色。但是我有不同颜色的度量 GC 和 DF 以及不同风格的算法“A1”和“A2”。我希望图例是具有不同线条样式的黑色。是否可以使用legend 函数来做到这一点?

【问题讨论】:

您好,我想帮忙,但我不确定我是否理解重点。图例(除了黑色之外)还应该包括标记吗? @BjörnB。是的,图例应该与运行代码时在正常情况下的显示完全相同,只是我需要它具有相同的颜色,即黑色。线条样式和标记应与原始样式相同,但颜色除外。 图例中的标记还可以是彩色的还是您希望它们也是黑色的? 【参考方案1】:

所以如果你只希望图例中的线条是黑色的,这很容易通过简单的列表理解和一个​​legendHandle来完成,就像这样(它必须在你创建图例之后插入,在lgd = ...行中@

leg = ax1.get_legend()
[lgd.set_color('black') for lgd in leg.legendHandles]

否则,您可以使用mlines 创建两条自定义线条并设置markersize = 0,那么您只有线条样式

import matplotlib.lines as mlines

labs = [l.get_label() for l in p]
black_line = mlines.Line2D([], [], color='black', marker='s',linestyle="--",
                          markersize=0, label=labs[0])
black_line2 = mlines.Line2D([], [], color='black', marker='s',linestyle=":",
                          markersize=0, label=labs[1])

lgd = ax1.legend(p, labs, bbox_to_anchor=(1.0, 0.22), loc=0, ncol=2,
                 fontsize='11', shadow=True, fancybox=True,numpoints=2,
                 handles=[black_line,black_line2])

在下图中,为了方便起见,我将图例的位置更改为loc = 2

【讨论】:

以上是关于matplotlib 图例仅基于线条样式而不是颜色的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib:在图例中移动标记位置

如何在直方图的 matplotlib 图例中制作线条而不是框/矩形

如何删除 matplotlib 图例上的线条/标记?

使用 Matplotlib 以图例样式绘制离散颜色条

Matplotlib中的颜色、线条、标记样式汇总

如何在 matplotlib 中延长线条?