2017-05-01 1 views
2

Ich versuche, die Frühlingsmonate in einem Pandas-Grundstück mit Nebengeschäften zu schattieren. Aber es schattiert nur den letzten Teilplot. Wie kann ich alle Parzellen beschatten?Pandas: wenden Sie axvspan auf alle Nebenstellen

Ich benutze axvspan, um zwischen dem 1. April und 30. Juni jedes Jahr durch das Durchschleifen eines gruppierten Datenrahmens dieser Enddaten zu schattieren.

Hier ist das Ergebnis.

pandas subplots

import matplotlib.pyplot as plt 

recent = daily[daily.Date.dt.year >= 2000] 

# Get only April 1 and Jume 30 each year 
spring_months = recent[((recent.Date.dt.month == 4) & (recent.Date.dt.day == 1)) | ((recent.Date.dt.month == 6) & (recent.Date.dt.day == 30))]['Date'] 

# Make pivot table with data, one measuring station per column. 
recent = recent.pivot(index='Date', columns='Station', values = 'Niveau(m)') 

recent.plot(figsize=[7,50], subplots=True) 
plt.xlim(xmax='2017-07-10') 

# Group the spring end-dates by year 
years = spring_months.drop_duplicates().groupby(spring_months.dt.year) 

# Loop through groups and add axvspan between April 1 and June 30 each year 
for n, g in years: 
    plt.axvspan(g.iloc[0], g.iloc[1], facecolor='g', alpha=0.5) 
    if g.iloc[0].year == 2016: 
     break 

Antwort

2

so viel Code wie möglich zu verwenden, modifizierte ich ein bisschen zu fälschen einem Datensatz. Der Schlüssel besteht darin, die Achsenhandles des Unterplots mit der ax = df.plot...-Anweisung zu erfassen.

Dann können Sie Liste Verständnis verwenden, um alle Achsen durchlaufen und zeichnen Sie die axvspan.

Erstellen eines Datensatzes:

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD')) 

df1 = df.rename_axis('date').reset_index() 

import matplotlib.pyplot as plt 

recent = df1[df1.date.dt.year >= 2000] 

# Get only April 1 and Jume 30 each year 
spring_months = df1[((df1.date.dt.month == 4) & (df1.date.dt.day == 1)) | ((df1.date.dt.month == 6) & (df1.date.dt.day == 30))]['date'] 

# Make pivot table with data, one measuring station per column. 
#recent = recent.pivot(index='Date', columns='Station', values = 'Niveau(m)') 

Holen Sie sich die Griffe für alle Achsen:

ax = df.plot(subplots=True, figsize=(6,6)) 


# Group the spring end-dates by year 
years = spring_months.drop_duplicates().groupby(spring_months.dt.year) 

Schleife durch alle Achsen mit Liste Verständnis axspans

# Loop through groups and add axvspan between April 1 and June 30 each year 
for n, g in years: 
    [i.axvspan(g.iloc[0], g.iloc[1], facecolor='g', alpha=0.5) for i in ax] 
    if g.iloc[0].year == 2016: 
     break 

enter image description here

zu ziehen
+0

Das war es, und sehr effizient auch. – robroc

Verwandte Themen