Как назначить сразу несколько меток в matplotlib?
У меня есть следующий набор данных:
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[9, 8, 7, 6, 5] ]
Теперь я рисую его с помощью:
import matplotlib.pyplot as plt
plt.plot(x, y)
Тем не менее, я хочу пометить 3-й набор данных этой командой, которая вызывает ошибку при вызове .legend()
:
lineObjects = plt.plot(x, y, label=['foo', 'bar', 'baz'])
plt.legend()
File "./plot_nmos.py", line 33, in <module>
plt.legend()
...
AttributeError: 'list' object has no attribute 'startswith'
Когда я проверяю lineObjects
:
>>> lineObjects[0].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[1].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[2].get_label()
['foo', 'bar', 'baz']
Вопрос
Есть ли элегантный способ назначить несколько ярлыков, просто используя метод .plot()
?
Ответы
Ответ 1
Невозможно построить эти два массива снова друг с другом напрямую (по крайней мере с версией 1.1.1), поэтому вы должны перебирать свои массивы y. Мой совет заключался бы в том, чтобы одновременно наклеить метки:
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels = ['foo', 'bar', 'baz']
for y_arr, label in zip(y, labels):
plt.plot(x, y_arr, label=label)
plt.legend()
plt.show()
Изменить: @gcalmettes указали, что в качестве массива numpy возможно построить все строки одновременно (путем их переноса). Подробнее см. @gcalmettes ответ и комментарии.
Ответ 2
Вы можете перебирать список своих объектов, поэтому метки назначаются индивидуально. Пример со встроенной функцией python iter
:
lineObjects = plt.plot(x, y)
plt.legend(iter(lineObjects), ('foo', 'bar', 'baz'))`
Изменить: после обновления до matplotlib 1.1.1 он выглядит как plt.plot(x, y)
, причем y в виде списка списков (как указано автором вопроса) не работает больше. Одноэтапное построение без итерации по массивам y по-прежнему возможно, подумав после передачи y как numpy.array
(предполагая (numpy) [http://numpy.scipy.org/], как было ранее импортировано).
В этом случае используйте plt.plot(x, y)
(если данные в массиве 2D y расположены в виде столбцов [ось 1]) или plt.plot(x, y.transpose())
(если данные в массиве 2D y расположены в виде строк [ось 0] )
Изменить 2:, как указано @pelson (см. комментарий ниже), функция iter
не нужна и простой plt.legend(lineObjects, ('foo', 'bar', 'baz'))
отлично работает
Ответ 3
Я столкнулся с той же проблемой, и теперь я нашел решение, которое является самым простым! Надеюсь, это не слишком поздно для вас. Нет итератора, просто назначьте свой результат структуре...
from numpy import *
from matplotlib.pyplot import *
from numpy.random import *
a = rand(4,4)
a
>>> array([[ 0.33562406, 0.96967617, 0.69730654, 0.46542408],
[ 0.85707323, 0.37398595, 0.82455736, 0.72127002],
[ 0.19530943, 0.4376796 , 0.62653007, 0.77490795],
[ 0.97362944, 0.42720348, 0.45379479, 0.75714877]])
[b,c,d,e] = plot(a)
legend([b,c,d,e], ["b","c","d","e"], loc=1)
show()
Похож:
![enter image description here]()
Ответ 4
Вы можете дать метки при построении кривых
import pylab as plt
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels=['foo', 'bar', 'baz']
colors=['r','g','b']
# loop over data, labels and colors
for i in range(len(y)):
plt.plot(x,y[i],'o-',color=colors[i],label=labels[i])
plt.legend()
plt.show()
![enter image description here]()
Ответ 5
В случае матричного графика numpy назначить сразу несколько легенд для каждого столбца
Я хотел бы ответить на этот вопрос, основываясь на построении матрицы с двумя столбцами.
Скажем, у вас есть матрица с двумя столбцами Ret
то этот код можно использовать для одновременного назначения нескольких меток
import pandas as pd, numpy as np, matplotlib.pyplot as plt
pd.DataFrame(Ret).plot()
plt.xlabel('time')
plt.ylabel('Return')
plt.legend(['Bond Ret','Equity Ret'], loc=0)
plt.show()
Я надеюсь, что это поможет