2012-08-07 29 views
11

Aquí está el código de la tramaleyenda para las estadísticas de resumen en 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

Quiero tener una leyenda para esta parcela que identificará los valores de los datos y los valores medios algo como esto

Black point = Data 
Red point = Mean. 

Cualquier puntero para conseguir el resultado deseado será altamente apreciado. Gracias

+3

+1 para buena pregunta, ejemplo reproducible, la visualización y la salida bien descrito deseado. El título también podría incluir la palabra "personalizado". Me imagino a mí mismo buscando una "leyenda personalizada en ggplot". –

Respuesta

17

Use una escala manual, es decir, en su caso scale_colour_manual. A continuación, asignar los colores a los valores en la escala utilizando la función aes() de cada 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

¡más simple que mi enfoque! – mnel

7

Puede combinar la variable media y datos en la misma hoja.de.datos y color/tamaño de la columna que es un factor, ya sea 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 no podía combinar, pero incluir la columna en ambos conjuntos de datos

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) 

Lo que da los mismos resultados

+0

+1 Más flexible que mi enfoque ;-) – Andrie

Cuestiones relacionadas