Назначьте цвета линии в пандах

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

Следующие работы:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=['1','2'])
df.plot(color = s)

Но когда мои индексы целые, он больше не работает и выдает как KeyError:

df = pd.DataFrame({1: [1, 2, 3, 4], 2: [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=[1,2])
df.plot(color = s)

Насколько я понимаю, когда используется целочисленный индекс, он как-то должен начинаться с 0. Это мое предположение, поскольку следующее также работает:

df = pd.DataFrame({0: [1, 2, 3, 4], 1: [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=[1,0])
df.plot(color = s)

Мой вопрос:

  • Что здесь происходит?
  • Предполагая, что у меня есть целочисленный индекс, который не начинается с 0 или не состоит из последовательных чисел, как я могу заставить эту работу работать без необходимости конвертировать индекс в строку или переиндексировать, начиная с 0?

РЕДАКТИРОВАТЬ:

Я понял, что даже в первом случае код не выполняет то, что ожидал. Кажется, что pandas соответствует индексу DataFrame и Series, только если оба являются целочисленными индексами, начиная с 0. Если это не так, выдается KeyError или, если индекс является str, используется порядок элементов.

Это правильно? И есть ли способ сопоставить индексы Series и DataFrame? Или я должен убедиться, что передал список цветов в правильном порядке?

3 ответа

Решение

Что здесь происходит?

Цвет аргумента ключевого слова унаследован от matplotlib.pyplot.plot (). Детали в документации не дают понять, что вы можете добавить в список цвета при построении. Учитывая, что цвет является ключевым аргументом из matplotlib, я бы рекомендовал не использовать серии Pandas для хранения значений цвета.

Как я могу сделать эту работу?

Используйте список вместо серии. Если вы использовали Серию с индексом, предназначенным для сопоставления столбцов вашего DataFrame с определенными цветами, вам сначала нужно отсортировать Серию. Если столбцы не в порядке, вам нужно будет также отсортировать столбцы.

# Option 1
s = s.sort_index()
df.plot(color = s.values) # as per Fiabetto's answer

# Option 2
df.plot(color = ['c', 'y']) # other method

Чтобы установить цвет для каждой строки, вы можете использовать параметр style. Например:

      df = pd.DataFrame({'A': [1, 2, 4], 'B': [1, 3, 9]})
df.plot(style={'A': 'r', 'B': 'g'})

Используя обозначение строки быстрого доступа в форме marker| line | color, вы также можете установить типы маркеров и линий:

      df = pd.DataFrame({'A': [1, 2, 4], 'B': [1, 3, 9]})
df.plot(style={'A': '*:r', 'B': '+--g'})

Пытаться:

df.plot(color = s.values)

это назначит цвета независимо от масштаба индекса.

РЕДАКТИРОВАТЬ:

Я попробовал с тремя столбцами:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2], '3': [4, 3, 2, 1]})
s = pd.Series(['c','y','r'], index=[1,3,2])
df.plot(color = s.sort_index().values)

и сортировка серии это работает.

Другие вопросы по тегам