2015-04-30 5 views
6

Ich habe einen Datenrahmen wie folgt aus:Wie erstellt man Pandas Groupby Plot mit Subplots?

 value  identifier 
2007-01-01 0.781611  55 
2007-01-01 0.766152  56 
2007-01-01 0.766152  57 
2007-02-01 0.705615  55 
2007-02-01 0.032134  56 
2007-02-01 0.032134  57 
2008-01-01 0.026512  55 
2008-01-01 0.993124  56 
2008-01-01 0.993124  57 
2008-02-01 0.226420  55 
2008-02-01 0.033860  56 
2008-02-01 0.033860  57 

So mache ich eine groupby pro Kennung:

df.groupby('identifier') 

Und nun möchte ich Nebenhandlungen in einem Raster erzeugen, ein Diagramm pro Gruppe. Ich habe versucht, sowohl

df.groupby('identifier').plot(subplots=True) 

oder

df.groupby('identifier').plot(subplots=False) 

und

plt.subplots(3,3) 
df.groupby('identifier').plot(subplots=True) 

ohne Erfolg. Wie kann ich die Graphen erstellen?

+0

Check-out 'seaborn', tut es dies wirklich schön. – cphlewis

+0

Danke, aber ich versuche seaborn zu vermeiden und benutze stattdessen nur matplotlib. Abhängigkeiten und Windows-Umgebung, etc. – Ivan

Antwort

5

Hier ist ein automatisiertes Layout mit vielen Gruppen (von zufälligen gefälschten Daten) und herumspielen mit grouped.get_group(key) wird Ihnen zeigen, wie man elegantere Plots macht.

import pandas as pd 
from numpy.random import randint 
import matplotlib.pyplot as plt 


df = pd.DataFrame(randint(0,10,(200,6)),columns=list('abcdef')) 
grouped = df.groupby('a') 
rowlength = grouped.ngroups/2       # fix up if odd number of groups 
fig, axs = plt.subplots(figsize=(9,4), 
         nrows=2, ncols=rowlength,  # fix as above 
         gridspec_kw=dict(hspace=0.4)) # Much control of gridspec 

targets = zip(grouped.groups.keys(), axs.flatten()) 
for i, (key, ax) in enumerate(targets): 
    ax.plot(grouped.get_group(key)) 
    ax.set_title('a=%d'%key) 
ax.legend() 
plt.show() 

enter image description here

+0

Sie erwähnten Fix wenn ungerade, also: rowlength = grouped.groups/2 + (0 wenn grouped.groups% 2 == 0 else 1) –

+0

Es ist hilfreich zu verstehen, dass der Grund dafür ist dass Sie eine Reihe von Achsen generieren und jedes Achsenobjekt der Reihe nach an jede geplottete Gruppe übergeben. Sie füllen jede Teilfigur mit einem Untergruppen-Plot. Ordentlich! –

6

Sie schwenken Verwenden Sie das identifiers in Spalten zu bekommen und dann plotten

pd.pivot_table(df.reset_index(), 
       index='index', columns='identifier', values='value' 
      ).plot(subplots=True) 

enter image description here

Und die Ausgabe von

pd.pivot_table(df.reset_index(), 
       index='index', columns='identifier', values='value' 
       ) 

Sieht aus wie -

identifier  55  56  57 
index 
2007-01-01 0.781611 0.766152 0.766152 
2007-02-01 0.705615 0.032134 0.032134 
2008-01-01 0.026512 0.993124 0.993124 
2008-02-01 0.226420 0.033860 0.033860