Назначьте цвета линии в пандах
Я пытаюсь отобразить некоторые данные в пандах, а встроенная функция построения графика удобно отображает одну строку на столбец. То, что я хочу сделать, это вручную назначить каждой строке цвет на основе классификации, которую я делаю.
Следующие работы:
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)
и сортировка серии это работает.