Matplotlib: цветной текст в легенде вместо строки
На некоторых ЖК-мониторах цвет горизонтальных линий в легенде трудно отличить друг от друга. (См. Прилагаемое изображение). Итак, вместо того, чтобы рисовать строку в легенде, можно ли просто нарисовать код самого текста? поэтому другие слова имеют "y = 0x" в синем, "y = 1x" зеленым и т.д....
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in xrange(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
ax.legend()
plt.show()
![enter image description here]()
PS. если бы линия могла быть толще только в легенде, но не в сюжете, это также сработало бы.
Ответы
Ответ 1
Мне было интересно то же самое. Вот что я придумал, чтобы изменить цвет шрифта в легенде. Я не совсем доволен этим методом, поскольку он кажется немного неуклюжим, но, похоже, он выполняет свою работу [Edit: см. Ниже лучший способ]:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
colors = []
for i in xrange(5):
line, = ax.plot(x, i * x, label='$y = %ix$' % i)
colors.append(plt.getp(line,'color'))
leg = ax.legend()
for color,text in zip(colors,leg.get_texts()):
text.set_color(color)
plt.show()
![the colorful results]()
2016 Редактировать:
Собственно, есть лучший способ. Вы можете просто перебирать строки в легенде, что позволяет избежать необходимости отслеживать цвета по строкам. Гораздо менее неуклюже. Теперь, меняя цвета линии, в основном однострочный (хорошо, на самом деле это двухстрочный). Вот полный пример:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in xrange(5):
ax.plot(x, i*x, label='$y = %ix$'%i)
leg = ax.legend()
# change the font colors to match the line colors:
for line,text in zip(leg.get_lines(), leg.get_texts()):
text.set_color(line.get_color())
plt.show()
2017 Edit: Наконец, если вам действительно нужен цветной текст вместо строки (как следует из названия), вы можете подавить строки в легенде, используя
leg = ax.legend(handlelength=0)
Ответ 2
Просто установите linewidth
дескрипторов легенды:
In [55]: fig, ax = plt.subplots()
In [56]: x = np.arange(10)
In [57]: for i in xrange(5):
....: ax.plot(x, i * x, label='$y = %ix$' % i)
....:
In [58]: leg = ax.legend(loc='best')
In [59]: for l in leg.legendHandles:
....: l.set_linewidth(10)
....:
![legend_linewidth.png]()
Ответ 3
Эта операция может быть выполнена чисто после того, как все построение выполняется с помощью геттеров/сеттеров легендарного текста и геттеров/сеттеров осевой линии. Установите цвета текста легенды так же, как цвета линий в цикле for перед построением графика.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in xrange(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
leg = ax.legend()
def color_legend_texts(leg):
"""Color legend texts based on color of corresponding lines"""
for line, txt in zip(leg.get_lines(), leg.get_texts()):
txt.set_color(line.get_color())
color_legend_texts(leg)
plt.show()
Основное отличие в этом ответе состоит в том, что форматирование графика может быть полностью отделено от операции построения.