Python 3.x matplotlib图例仅基于线样式,不基于颜色

Python 3.x matplotlib图例仅基于线样式,不基于颜色,python-3.x,matplotlib,legend,Python 3.x,Matplotlib,Legend,我正在一个图中绘制两个不同算法的两个度量值,它们的样式和颜色不同。 我对不同的算法使用不同的样式,对不同的度量使用不同的颜色。 我希望图例仅基于线条样式 我的代码是 #!/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

我正在一个图中绘制两个不同算法的两个度量值,它们的样式和颜色不同。 我对不同的算法使用不同的样式,对不同的度量使用不同的颜色。 我希望图例仅基于线条样式

我的代码是

#!/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'。我希望图例是黑色的,有不同的线条样式。是否可以使用
图例
功能执行此操作?


因此,如果您只希望图例中的行为黑色,则可以通过简单的列表理解和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


您好,我很想帮忙,但是我不确定我是否理解这一点。是否应该使用图例(除了黑色)还包括标记?@BjörnB。是的,图例应该与您运行代码时在正常情况下的显示完全相同,只是我需要它具有相同的颜色,即黑色。线条样式和标记应该与原始样式和标记相同,只是颜色不同。图例中的标记是否仍然是彩色的,或者您希望它们也是黑色的?