2015-05-21 11 views
6

Próbuję wygenerować siatkę subplotów na podstawie obiektu grupy Pandy. Chciałbym, aby każdy dział był oparty na dwóch kolumnach danych dla jednej grupy obiektu groupby. Fałszywe zestaw danych:Wykreślanie grup Pandy grup za pomocą podpól i pętli

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 

Próbowałem następujący kod:

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

Ale to generuje 4 identyczne wątków z wszystkich danych kreślone na każdym (patrz przykład wyjścia poniżej):

Chciałbym zrobić coś takiego, jak to naprawić:

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

ale otrzymuję ten błąd

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

będę mieć szereg dynamicznych grup w obiekcie GroupBy chcę wykreślić, i wiele innych elementów niż fałszywych danych dostarczonych mam. Właśnie dlatego potrzebuję eleganckiego, dynamicznego rozwiązania, a każdy zestaw danych grupowych jest kreślony na oddzielnym podpunkcie.

Odpowiedz

9

Brzmi jak chcesz iteracyjne nad grupami i osi w równoległym, więc zamiast zagnieżdżone for pętle (które wykonuje iteracje nad wszystkimi grupami dla każdej osi), chcesz coś takiego:

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

enter image description here

masz rację w swoim drugim fragmencie kodu, ale dostajesz błąd, ponieważ axs jest tablicą osi, ale plot ex postrzega tylko jedną oś. Powinno więc również zastąpić next(axs) w twoim przykładzie wartością ax = axs.next() i zmienić argument z plot na ax=ax.

+0

To zadziałało fantastycznie, dziękuję! – fireitup