Подтвердить что ты не робот

Как назначить сразу несколько меток в 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()?

4b9b3361

Ответ 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()

Я надеюсь, что это поможет