2015-09-11 2 views
2

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

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

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?

EDIT:

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

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

+0

Вы не хотите, чтобы индексы соответствовали. Вы сопоставляете индекс Series с столбцами DataFrame. – thecircus

ответ

4

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

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

Как это сделать?

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

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

# Option 2 
df.plot(color = ['c', 'y') 
+0

Я закончил сортировку как серии, так и DataFrame, а затем превратил серию в список, как было предложено. Это работает без проблем, но я надеялся, что есть более элегантный способ, но я вижу, что не может быть, если ключевое слово цвета соответствует matplotlib (что, очевидно, ничего не знает о Серии). – GebitsGerbils

+0

Да, к сожалению, Pandas - это всего лишь обертка для matplotlib. matplotlib позволяет пользователю почти что угодно, но он может стать действительно грязным. – thecircus

+0

Строка кода в опции 2 пропускает закрытие ']'. – MERose

3

Try:

df.plot(color = s.values) 

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

EDIT:

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

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) 

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

+0

Это действительно работает, но я понял, что фактическая проблема - это порядок. Я отредактирую вопрос, чтобы включить это! – GebitsGerbils

+1

Сортировка серии помогает только в том случае, если столбцы DataFrame упорядочены. – thecircus

Смежные вопросы