легенда matplotlib, основанная только на стиле линии, но не на цвете - PullRequest
1 голос
/ 19 апреля 2020

Я строю значения двух метрик для двух разных алгоритмов в разных стилях и цветах на одном графике. Я использую разные стили для разных алгоритмов и разные цвета для разных метрик. Я хочу, чтобы легенда основывалась только на стиле линии.

Мой код:

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

В приведенной выше легенде используются разные цвета. Но у меня есть метрики G C и DF в разных цветах и ​​алгоритмы 'A1' и 'A2' в разных стилях. Я хочу, чтобы легенда была черного цвета с разными стилями линий. Можно ли это сделать, используя функцию legend?

1 Ответ

1 голос
/ 19 апреля 2020


так что, если вы хотите, чтобы строки в легенде были черными, это легко сделать с помощью простого понимания списка и легендарного дескриптора, подобного этому (его нужно вставить после того, как вы создали легенду, в строке 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

Exemplary black only linestyle legend

...