2014-09-06 14 views
7

Ho un DataFrame (data) con un indice intero semplice e 5 colonne. Le colonne sono Date, Country, AgeGroup, Gender, Stat. (Nomi modificati per proteggere l'innocente.) Vorrei produrre unodove il Country definisce la riga, AgeGroup definisce la colonna e Gender definisce la tonalità. Per ognuno di questi particolari, vorrei produrre un grafico delle serie temporali. Cioè Dovrei ottenere una serie di grafici ognuno dei quali ha 2 serie temporali su di esso (1 maschio, 1 femmina). Posso ottenere molto stretto con:Tracciare le serie temporali utilizzando Seaborn FacetGrid

g = sns.FacetGrid(data, row='Country', col='AgeGroup', hue='Gender') 
g.map(plt.plot, 'Stat') 

Tuttavia, questo solo mi dà il numero del campione sulla asse x, piuttosto che le date. C'è una soluzione rapida in questo contesto.

Più in generale, capisco che l'approccio con FacetGrid è quello di rendere la griglia e quindi la funzione di tracciamento di map. Se volessi svolgere la mia funzione di tracciamento, quali sono le convenzioni che deve seguire? In particolare, come posso scrivere la mia funzione di tracciamento (passare a map per FacetGrid) che accetta più colonne di dati del mio set di dati?

+0

Quando si dice "questo mi dà solo il numero di campione sull'asse x anziché le date", non è chiaro da dove le date dovrebbero provenire. Questa è una colonna diversa nel tuo dataframe? – mwaskom

+0

Sì, vedi sopra, c'è una colonna chiamata "Date" e mi piacerebbe usarla per generare tick significativi sull'asse x. – 8one6

+0

Oops, mancato, mi dispiace. – mwaskom

risposta

9

Risponderò prima alla tua domanda più generale. Le regole per le funzioni che è possibile passare ad FacetGrid.map sono:

  • devono prendere ingressi array simile come argomenti posizionali, con il primo argomento corrispondente all'asse x ed il secondo argomento corrispondente all'asse y (anche se, più la seconda condizione poco
  • Essi devono anche accettare due argomenti chiave:. color e label Se si desidera utilizzare una variabile hue di questi dovrebbero ottenere passato alla funzione sottostante tramando, anche se si può semplicemente prendere **kwargs e non fare qualsiasi cosa con loro se non è rilevante per la trama specifica che stai facendo.
  • Quando chiamati, devono tracciare un grafico sugli assi matplotlib "attualmente attivi".

Ci possono essere casi in cui la funzione disegna una trama che sembra corretto senza prendere x, y, ingressi di posizione. Penso che sia fondamentalmente quello che sta succedendo qui con il modo in cui stai usando plt.plot. Può essere più facile quindi semplicemente chiamare, ad esempio, g.set_axis_labels("Date", "Stat") dopo aver utilizzato map, che rinomina correttamente gli assi. Potresti anche voler fare g.set(xticklabels=dates) per ottenere zecche più significative.

C'è anche una funzione più generale, FacetGrid.map_dataframe. Le regole qui sono simili, ma la funzione che si passa deve accettare un input dataframe in un parametro chiamato data, e invece di prendere input posizionali come array prende le stringhe che corrispondono alle variabili in quel dataframe. Su ogni iterazione attraverso le faccette, la funzione verrà chiamata con il frame di dati di input mascherato solo con i valori per quella combinazione di livelli row, col e hue.

Quindi nel tuo caso specifico, sarà necessario scrivere una funzione che possiamo chiamare plot_by_date che dovrebbe essere simile a questa:

def plot_by_date(x, y, color=None, label=None): 

    ... 

(sarei più utile sul corpo, ma io in realtà non so come fare molto con date e matplotlib).Il risultato finale è che quando chiami questa funzione dovrebbe tracciare gli assi attualmente attivi. Quindi fare

g.map(plot_by_date, "Date", "Stat") 

E dovrebbe funzionare, credo.

+1

Quello che intendevo era, se volevo svolgere la mia funzione, cosa dovrebbe restituire? Cioè Diciamo che voglio fare una stupida funzione che disegna semplicemente una linea orizzontale in ogni faccetta a 'y = 2' e ignora tutti i dati di input. Allora come sarebbe quella funzione? – 8one6

+2

Ah, il valore restituito viene ignorato .... l'importante è che la funzione * stampi *. In realtà per quell'esempio specifico puoi semplicemente fare 'g.map (plt.axhline, y = 2)'. Non sono sicuro se questo aiuti comunque la tua comprensione generale. – mwaskom

+1

Ho aggiunto un po 'di più su ciò che stai specificatamente cercando di fare. – mwaskom

Problemi correlati