2010-10-21 18 views
18

Ho un boxplot che mostra più caselle. Voglio collegare la media per ogni scatola insieme con una linea. Il boxplot non visualizza la media di default, invece la linea centrale indica solo la mediana. Ho provatoUnire significa su un boxplot con una linea (ggplot2)

ggplot(data, aes(x=xData, y=yData, group=g)) 
    + geom_boxplot() 
    + stat_summary(fun.y=mean, geom="line") 

Questo non funziona.

È interessante notare che, facendo

stat_summary(fun.y=mean, geom="point") 

pareggi il punto mediano in ogni casella. Perché la "linea" non funziona?

Qualcosa di simile, ma utilizzando ggplot2, http://www.aliquote.org/articles/tech/RMB/c4_sols/plot45.png

+1

se qualcuno può dire il razionale per il gruppo = 1 in soluzione di Bernd, sarebbe bello. – nixbox

+0

La mia ipotesi è quel gruppo = 1 gruppo estetico disabilitato, perché se è abilitato, le linee vengono disegnate separatamente per ogni gruppo, che nel caso della media sarebbe solo un punto, quindi non ci sarebbero linee da disegnare. – nixbox

+0

Sì, penso che tu abbia ragione. Ho trovato una buona spiegazione nel libro di Hadley Wickham e ho aggiornato la mia risposta. –

risposta

27

è che quello che stai cercando?

library(ggplot2) 

x <- factor(rep(1:10, 100)) 
y <- rnorm(1000) 
df <- data.frame(x=x, y=y) 

ggplot(df, aes(x=x, y=y)) + 
geom_boxplot() + 
stat_summary(fun.y=mean, geom="line", aes(group=1)) + 
stat_summary(fun.y=mean, geom="point") 

Aggiornamento:

Alcuni chiarimenti su come impostare group = 1: Penso che ho trovato una spiegazione nel libro di Hadley Wickham "ggplot2: Elegant Graphics for Data Analysis". A pagina 51 scrive:

Diversi gruppi su diversi livelli.

A volte si desidera stampare i riepiloghi in base ai diversi livelli dell'aggregazione . Diversi livelli potrebbero avere un aspetto estetico di gruppo diverso, quindi alcuni mostrano i singoli livelli mentre altri visualizzano i riepiloghi dei gruppi più grandi.

Sulla base dell'esempio precedente, supponiamo di voler aggiungere una singola linea di liscio alla trama appena creato, in base sulle età e altezze di tutti i ragazzi. Se usiamo lo stesso raggruppamento per lo il liscio che abbiamo usato per la linea, otteniamo il primo grafico in Figura 4.4.

p + geom_smooth (AES (gruppo = Soggetto), method = "lm", SE = F)

Questo non è quello che volevamo; abbiamo aggiunto inavvertitamente una linea lisciata per ogni ragazzo. Questo nuovo livello richiede un gruppo estetico diverso gruppo = 1, in modo che la nuova riga sia basata su tutti i dati, come mostrato nel secondo grafico nella figura. Lo strato modificato assomiglia a questo:

p + geom_smooth (AES (gruppo = 1), method = "lm", size = 2, se = F)

[...] L'utilizzo AES (group = 1) nello strato liscio si inserisce una sola riga di misura migliore in tutti i ragazzi."

+2

sì !, grazie, ma cosa significa group = 1 qui? – nixbox

+0

Äh, sapevo che la domanda sarebbe arrivata :-) Scusa ma devo ammettere che non ne ho idea. Alcune settimane fa ho avuto un problema simile e ho trovato quella soluzione da qualche parte che ha funzionato per me. –

+0

haha, grazie comunque :) – nixbox

Problemi correlati