2015-05-21 10 views
6

Sto provando a generare una griglia di sottotrame basata su un oggetto groupby di Pandas. Vorrei che ogni grafico fosse basato su due colonne di dati per un gruppo dell'oggetto groupby. Falso set di dati:Stampa di gruppi di panda tramite le sottotrame e il loop

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 

Ho provato il codice seguente:

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") 

ma genera 4 sottotrame identici con tutti i dati tracciati su ciascun (vedi esempio uscita inferiore):

enter image description here

mi piacerebbe fare qualcosa di simile alla seguente per risolvere questo problema:

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

ma ottengo questo errore

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

avrò una serie dinamica di gruppi nell'oggetto GroupBy voglio tracciare, e molti più elementi di dati falsi che ho fornito. Questo è il motivo per cui ho bisogno di una soluzione elegante e dinamica e ogni gruppo di dati del gruppo è tracciato su una sottotrama separata.

risposta

9

Sembra che si desidera per scorrere i gruppi e gli assi in parallelo, quindi piuttosto che aver nidificato for loop (che itera su tutti i gruppi per ogni asse), si desidera qualcosa di simile:

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

enter image description here

Lei ha l'idea giusta nel secondo frammento di codice, ma che stai ricevendo un errore perché axs è una serie di assi, ma plot ex pects solo un singolo asse. Quindi dovrebbe anche funzionare per sostituire next(axs) nell'esempio con ax = axs.next() e modificare l'argomento di plot a ax=ax.

+0

Questo ha funzionato in modo fantastico grazie! – fireitup

Problemi correlati