首页 > 解决方案 > matplotlib 图例仅基于线条样式而不是颜色

问题描述

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

我的代码是

#!/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是否可以使用函数来做到这一点?

标签: python-3.xmatplotliblegend

解决方案



所以如果你只希望图例中的线条是黑色的,这很容易通过简单的列表理解和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

示例性的纯黑色线型图例


推荐阅读