2016-06-10 23 views
9

Utilizziamo come esempio il set di dati mpg, in particolare le colonne class e cyl. Posso vedere quante voci ci sono, per singola class, e differenziare il colore di riempimento in base al valore cil:Dati aggregati con ggplot

library(ggplot2) 
p <- ggplot(mpg) 
p <- p + geom_bar(mapping=aes(x=class, fill=factor(cyl)), position=position_dodge()) 
print(p) 

enter image description here

Quello che mi piacerebbe vedere, però, è la media numero di voci (per class), per diversi valori di cyl. Fondamentalmente, se guardi la trama sopra, voglio una singola barra per classe, la cui altezza dovrebbe essere l'altezza media delle barre colorate per quella classe.

io sono in grado di ottenere questo risultato pre-elaborazione del frame di dati, ad esempio:

df <- aggregate(formula=cyl~class, data=mpg, FUN=function(x) { length(x)/length(unique(x)) }) 
p <- ggplot(df) 
p <- p + geom_bar(mapping=aes(x=class, y=cyl), stat='identity') 
p <- p + ylab('average count') 

Che dà il mio output desiderato:

enter image description here

Tuttavia, dato quanto potente ggplot2 è , Mi chiedo se questo è possibile attraverso le funzioni di ggplot. Immagino che ciò implichi l'utilizzo di uno specifico stat (magari con group=cyl?), Ma non sono in grado di farlo.

+0

Dare un'occhiata a 'stat_summary' [link] (http: //docs.ggplot2 .org/current/stat_summary.html) – user3631369

+0

@ user3631369 Ora ci sto giocando, ma non sto ottenendo risultati. Non riesco ad aggregare oltre il campo cilindrico. – natario

risposta

13

Siamo in grado di collegare la formula direttamente in stat_summary() per generare il risultato desiderato, senza passaggi intermedi:

library(ggplot2) 
ggplot(mpg) + 
    stat_summary(aes(x = class, y = cyl), 
       fun.y = function(x) length(x)/length(unique(x)), 
       geom = "bar") 

enter image description here

+0

c'è un modo per passare a 'fun.y' una funzione di aggregazione, basata su altre variabili nel data.frame? (Quindi, che posso calcolare una somma all'interno di ogni gruppo - in qualche modo non sono riuscito a farlo funzionare ...) –

+0

Potresti fare un esempio? Forse fai una nuova domanda – mtoto

Problemi correlati