подзаголовки из мультииндексного фрейма данных pandas, сгруппированные по уровням

Как сделать несколько графиков из мультииндексированного DataFrame pandas на основе одного из уровней мультииндекса?

У меня есть результаты модели с использованием разных технологий в разных сценариях, результаты могут выглядеть примерно так:

import numpy as np
import pandas as pd
df=pd.DataFrame(abs(np.random.randn(12,4)),columns=[2011,2012,2013,2014])
df['scenario']=['s1','s1','s1','s2','s2','s3','s3','s3','s3','s4','s4','s4']
df['technology'=['t1','t2','t5','t2','t6','t1','t3','t4','t5','t1','t3','t4']
dfg=df.groupby(['scenario','technology']).sum().transpose()

dfg будет использовать технологии каждый год для каждого сценария. Я хотел бы иметь подзаговор для каждого сценария с легендой.

Если я просто использую аргумент subplots = True, тогда он строит все возможные комбинации (12 подзаголовков)

dfg.plot(kind='bar',stacked=True,subplots=True)

Основываясь на этом ответе, я стал ближе к тому, что искал.

f,a=plt.subplots(2,2)

fig1=dfg['s1'].plot(kind='bar',ax=a[0,0])

fig2=dfg['s2'].plot(kind='bar',ax=a[0,1])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,0])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,1])

plt.tight_layout()

но результат не идеален, у каждого подзаговора своя легенда ... и это затрудняет чтение. Должен быть более простой способ создания подзаголовков из мультииндексированных фреймов данных ... Спасибо!

РЕДАКТИРОВАТЬ1: Тед Петру предложил хорошее решение с использованием диаграммы множителей морского дна, но у меня есть две проблемы. У меня уже есть определенный стиль, и я бы предпочел не использовать стиль seaborn (одним из решений может быть изменение параметров seaborn). Другая проблема заключается в том, что я хотел использовать линейчатую диаграмму с накоплением, что требует значительных дополнительных настроек < / а>. Есть ли шанс сделать что-то подобное с Matplotlib?


person Nabla    schedule 23.01.2017    source источник
comment
Вы можете использовать функции построения морских графиков без стиля морских наблюдений, если импортируете морские изображения таким образом: import seaborn.apionly as sns   -  person Ramon Crehuet    schedule 12.05.2017


Ответы (1)


На мой взгляд, легче проводить анализ данных, когда вы «приводите в порядок» свои данные, когда каждый столбец представляет одну переменную. Здесь все 4 года представлены в разных столбцах. У Pandas есть одна функция и один метод для создания длинных (аккуратных) данных из обширных (беспорядочных) данных. Вы можете использовать df.stack или pd.melt(df) для очистки ваших данных. Затем вы можете воспользоваться отличной библиотекой seaborn, которая ожидает, что аккуратные данные позволят легко построить все, что вы хотите.

Уберите данные

df1 = pd.melt(df, id_vars=['scenario', 'technology'], var_name='year')
print(df1.head())

  scenario technology  year     value
0       s1         t1  2011  0.406830
1       s1         t2  2011  0.495418
2       s1         t5  2011  0.116925
3       s2         t2  2011  0.904891
4       s2         t6  2011  0.525101

Используйте Seaborn

import seaborn as sns
sns.factorplot(x='year', y='value', hue='technology', 
               col='scenario', data=df1, kind='bar', col_wrap=2,
              sharey=False)

введите описание изображения здесь

person Ted Petrou    schedule 23.01.2017
comment
Мне этот ответ нравится больше, чем мой. - person piRSquared; 23.01.2017
comment
Убрать данные - действительно хорошее предложение! Я немного не хочу использовать seaborn, потому что у меня в отчете несколько цифр, и я хочу, чтобы все они были выполнены в одном стиле (цвета, размер шрифта ...). есть ли способ сделать то же самое с matplotlib / pandas? Или изменить параметры стиля seaborn, чтобы он соответствовал определенному стилю matplotlib? - person Nabla; 23.01.2017