Измените записи легенды по значениям столбцов в matplotlib - PullRequest
0 голосов
/ 09 марта 2020

Я много борюсь с изменением меток в легенде в диаграммах matplotlib. Это мой график: enter image description here

Я хотел бы изменить легенду, чтобы метки основывались на значениях в столбце с именем «name», а не на имени столбца.

Вот как я создал исходный график:

ax = plt.figure()
df.iloc[3000:3005,:].loc[:,float_cols].T.plot(figsize=(10,6))
plt.title('title',size=(20))
plt.ylabel('Y', size=(14))
plt.xlabel('x', size=(14))

Вот как я пытался изменить легенду на имя столбца:

targets = df['name']

ax = plt.figure()
df.iloc[3000:3005,:].loc[:,float_cols].T.plot(figsize=(10,6).label=targets)
plt.title('title',size=(20))
plt.ylabel('Y', size=(14))
plt.xlabel('x', size=(14))

, но это не так т работа. Я также пробовал другие способы, такие как использование plt.legend, но это не сработало.

Моя конечная цель: изменить легенду так, чтобы метки основывались на названиях этих наблюдений (из столбца имя)

Редактировать: я пытался:

plt.figure()
for i in range(df.shape[1]):
  plt.plot(df, df.iloc[3000:3005,:].loc[:,float_cols], label = df.columns['name'])

plt.legend()
plt.tight_layout()
plt.show()

, но это не сработало, я получил эту ошибку:

IndexError: только целые числа, ломтики (:), многоточие (...), numpy .newaxis (None) и целочисленные или логические массивы являются допустимыми индексами

также пытались это сделать:

plt.figure()
for i in range(df.shape[1]):
  plt.plot(df, df.iloc[3000:3005,:].loc[:,float_cols], label = df.columns[i])

plt.legend()
plt.tight_layout()
plt.show()

Но также получена ошибка:

ValueError: x и y должны иметь одинаковое первое измерение, но иметь формы (8606, 444) и (5, 438)

РЕДАКТИРОВАТЬ 2: пробовал это:

targets = df['name']

plt.figure()
for i in range(df.shape[1]):
    plt.plot(df.iloc[3000:3005,:], label = targets[i])

plt.legend()
plt.tight_layout()
plt.show()

получил ошибку:

в 3 plt.figure () 4 для i в диапазоне (df.shape 1 ): ----> 5 plt.plot (df.iloc [3000: 3005 ,:], label = target [i]) 6 7 plt.legend ()

~ .conda \ envs \ reut \ lib \ site-packages \ pandas \ core \ series.py в getitem (self, key) 869 key = com.apply_if_callable (key , self) 870 try: -> 871 result = self.index.get_value (self, key) 872 873, если не is_scalar (result):

~ .conda \ envs \ reut \ lib \ site-packages \ pandas \ core \ indexes \ base.py в get_value (self, series, key) 4403 k = self._convert_scalar_indexer (k, kind = "getitem") 4404 try: -> 4405 вернуть self._engine.get_value (s, k , tz = getattr (series.dtype, "tz", None)) 4406 за исключением KeyError как e1: 4407, если len (self)> 0 и (self.holds_integer () или self.is_boolean ()):

pandas_libs \ index.pyx в pandas ._ libs.index.IndexEngine.get_value ()

pandas_libs \ index.pyx в pandas ._ libs.index.IndexEngine.get_value ()

pandas_libs \ index.pyx в pandas ._ libs.index.IndexEngine.get_lo c ()

pandas_libs \ hashtable_class_helper.pxi в pandas ._ libs.hashtable.Int64HashTable.get_get_63 (63) *

pandas_libs \ hashtable_class_helper.pxi в pandas ._ libs.hashtable.Int64HashTable.get_item ()

KeyError: 0

1 Ответ

1 голос
/ 09 марта 2020

Использование регулярного matplotlib plt.plot():

import matplotlib.pyplot as plot
import pandas as pd
import numpy as np

x = np.linspace(0, 10, 100)

targets = ['cos(x)', 'sin(x)', 'cos(x) + sin(x)']
d = {'col1': np.cos(x), 'col2': np.sin(x), 'col3': np.sin(x) + np.cos(x)}
df = pd.DataFrame(data = d)

plt.figure()
for i in range(df.shape[1]):
  plt.plot(x, df.iloc[:,i], label = targets[i])

plt.legend()
plt.tight_layout()
plt.show()

enter image description here

Вы можете изменить targets на любое значение, включая df['name'] в зависимости от организации вашего фрейма данных.

Наконец, если у вас нет вектора x, просто используйте вместо него plt.plot( df.iloc[:,i], label = targets[i]), и он построит ваши данные относительно индексов позиции, как в Ваш пример в вашем вопросе.

РЕДАКТИРОВАТЬ на основе комментариев и обсуждения в чате:

Для вашего случая вы можете попробовать что-то похожее на:

indexes_wanted = [2000, 100, 3200]
targets = df['names']

plt.figure()
for i in indexes_wanted:
  plt.plot(x, df.iloc[i, :][float_cols], label = targets.iloc[i])

plt.legend()
plt.tight_layout()
plt.show()
...