2015-05-21 7 views
6

Ich versuche, ein Raster von Subplots basierend auf einem Pandas groupby Objekt zu generieren. Ich möchte, dass jedes Diagramm auf zwei Datenspalten für eine Gruppe der Gruppe basiert. Fälschungs-Datensatz:Plotten Pandas groupby Gruppen mit Subplots und Schleife

C1,C2,C3,C4 
1,12,125,25 
2,13,25,25 
3,15,98,25 
4,12,77,25 
5,15,889,25 
6,13,56,25 
7,12,256,25 
8,12,158,25 
9,13,158,25 
10,15,1366,25 

Ich habe den folgenden Code versucht:

import pandas as pd 
import csv 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import math 

#Path to CSV File 
path = "..\\fake_data.csv" 

#Read CSV into pandas DataFrame 
df = pd.read_csv(path) 

#GroupBy C2 
grouped = df.groupby('C2') 

#Figure out number of rows needed for 2 column grid plot 
#Also accounts for odd number of plots 
nrows = int(math.ceil(len(grouped)/2.)) 

#Setup Subplots 
fig, axs = plt.subplots(nrows,2) 

for ax in axs.flatten(): 
    for i,j in grouped: 
     j.plot(x='C1',y='C3', ax=ax) 

plt.savefig("plot.png") 

sondern erzeugt 4 identische Nebenhandlungen mit allen Daten auf jedem (siehe Beispiel Ausgangs unten) aufgetragen:

enter image description here

ich möchte etwas tun, wie folgt aus diesen zu beheben:

for i,j in grouped: 
    j.plot(x='C1',y='C3',ax=axs) 
    next(axs) 

aber ich bekomme diese Fehlermeldung

AttributeError: 'numpy.ndarray' object has no attribute 'get_figure'

ich eine dynamische Anzahl von Gruppen im groupby bezwecken will ich darstellen mag, und viele mehr Elemente als die gefälschten Daten, die ich zur Verfügung gestellt habe. Deshalb brauche ich eine elegante, dynamische Lösung, und jeder Gruppendatensatz wird auf einem separaten Unterplot dargestellt.

Antwort

9

Klingt wie Sie über die Gruppen zu durchlaufen wollen und die Achsen parallel, also eher als for Schleifen verschachtelt haben (die iteriert über alle Gruppen für jede Achse), können Sie so etwas wie dies wollen:

for (name, df), ax in zip(grouped, axs.flat): 
    df.plot(x='C1',y='C3', ax=ax) 

enter image description here

Sie haben die richtige Idee in Ihrem zweiten Code-Schnipsel, aber Sie einen Fehler bekommen, weil axs eine Reihe von Achsen, aber plot ex hat nur eine einzige Achse. So sollte es auch funktionieren, next(axs) in Ihrem Beispiel durch ax = axs.next() zu ersetzen und das Argument von plot zu ax=ax zu ändern.

+0

Das hat fantastisch funktioniert danke! – fireitup