2012-08-07 14 views
11

Ecco il codice per la tramaleggenda per le statistiche riassuntive in ggplot2

library(ggplot2) 
df <- data.frame(gp = factor(rep(letters[1:3], each = 10)), y = rnorm(30)) 
library(plyr) 
ds <- ddply(df, .(gp), summarise, mean = mean(y), sd = sd(y)) 
ggplot(df, aes(x = gp, y = y)) + 
    geom_point() + 
    geom_point(data = ds, aes(y = mean), colour = 'red', size = 3) 

enter image description here

voglio avere una legenda per questa trama che identificherà i valori dei dati e dei valori medi qualche cosa come questa

Black point = Data 
Red point = Mean. 

Qualsiasi puntatore per ottenere il risultato desiderato sarà molto apprezzato. Grazie

+3

+1 per buona domanda, riproducibile esempio, la visualizzazione e l'uscita ben descritto desideri. Il titolo potrebbe anche includere la parola "personalizzato". Mi immagino di cercare una "legenda personalizzata in ggplot". –

risposta

17

Utilizzare una scala manuale, ad esempio nel proprio caso scale_colour_manual. Mappare i colori ai valori della scala utilizzando la funzione di ogni aes() geom:

ggplot(df, aes(x = gp, y = y)) + 
    geom_point(aes(colour="data")) + 
    geom_point(data = ds, aes(y = mean, colour = "mean"), size = 3) + 
    scale_colour_manual("Legend", values=c("mean"="red", "data"="black")) 

enter image description here

+0

più semplice del mio approccio! – mnel

7

È possibile combinare la variabile media e dati nello stesso data.frame e colore/formato per colonna che è un fattore, sia data o mean

library(reshape2) 

# in long format 
dsl <- melt(ds, value.name = 'y') 
# add variable column to df data.frame 
df[['variable']] <- 'data' 
# combine 
all_data <- rbind(df,dsl) 

# drop sd rows 

data_w_mean <- subset(all_data,variable != 'sd',drop = T) 

# create vectors for use with scale_..._manual 
colour_scales <- setNames(c('black','red'),c('data','mean')) 
size_scales <- setNames(c(1,3),c('data','mean')) 

ggplot(data_w_mean, aes(x = gp, y = y)) + 
    geom_point(aes(colour = variable, size = variable)) + 
    scale_colour_manual(name = 'Type', values = colour_scales) + 
    scale_size_manual(name = 'Type', values = size_scales) 

enter image description here

O non si poteva combinare, ma includere la colonna in entrambi i set di dati

dsl_mean <- subset(dsl,variable != 'sd',drop = T) 
ggplot(df, aes(x = gp, y = y, colour = variable, size = variable)) + 
    geom_point() + 
    geom_point(data = dsl_mean) + 
    scale_colour_manual(name = 'Type', values = colour_scales) + 
    scale_size_manual(name = 'Type', values = size_scales) 

Che dà gli stessi risultati

+0

+1 Più flessibile del mio approccio ;-) – Andrie

Problemi correlati