2015-04-30 11 views
6

Mam ramki danych tak:Jak utworzyć grupę Pandy za pomocą wątku z subplotami?

 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 

Więc robię GroupBy za Identyfikator:

df.groupby('identifier') 

A teraz chcę, aby wygenerować wątków w siatce, jedną działkę w grupie. Próbowałem zarówno

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

lub

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

i

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

bezskutecznie. Jak mogę utworzyć wykresy?

+0

Sprawdź "seaborn", robi to naprawdę ładnie. – cphlewis

+0

Dzięki, ale staram się unikać seaborn i zamiast tego używam tylko matplotlib. Zależności i środowisko Windows, itp. – Ivan

Odpowiedz

5

Oto automatyczny układ z dużą liczbą grup (losowych fałszywych danych) i zabawa z grouped.get_group(key) pokaże ci, jak robić bardziej eleganckie wątki.

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

Wspomniałeś o poprawce, jeśli jest ona nieparzysta, więc: rowlength = grouped.ngroups/2 + (0 jeśli grouped.ngroups% 2 == 0 else 1) –

+0

Pomocne jest zrozumienie, że powodem tego działania jest że generujesz pęczek osi i przekazujesz kolejno każdy obiekt osi do każdej wykreślanej grupy. Każdą z subkategorii wypełniasz działką podgrup. Schludny! –

6

używasz pivot uzyskać identifiers w kolumnach, a następnie wykreślić

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

enter image description here

, a wyjście

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

Wygląda to -

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 
Powiązane problemy