2011-06-07 15 views
6

Quiero usar ggplot para crear gráficos de dispersión que muestren los datos de comparación de métodos. Las gráficas deben tener los datos brutos, la línea ideal y la línea ajustada con error. La leyenda debe mostrar el tipo de línea/ancho de línea/color de línea para las líneas ideales y ajustadas.problemas de leyenda en el gráfico de dispersión ggplot

puedo conseguir más de lo que quiero, pero no tienen estos problemas con la leyenda:

  • la leyenda muestra 2 líneas para cada tipo de línea, ¿por qué ?, ¿cómo fijar?

  • preferiría sin fondo de color rosa en los rectángulos de leyenda (si no se especifica el color de relleno a continuación, el rectanglebackground gris se convierte en el valor predeterminado, que no me gusta nada mejor)

Código de muestra:

set.seed(603) 
x.raw=rnorm(n=30, mean=50, sd=20) 
y.raw=x.raw+rnorm(n=30, mean=2, sd=2) 
x.raw=round(x.raw, 2); y.raw=round(y.raw, 2) 
df=data.frame(x=x.raw, y=y.raw) 

require(ggplot2, quietly=TRUE) 
theme_set(theme_bw()) 
xy.range=range(df$x, df$y) 

p=ggplot(df, aes(x=x, y=y)) + 
geom_point(shape=ifelse(nrow(df)>49, 1, 16)) + 
geom_smooth(method=lm, fill="red1", aes(colour="Fitted", linetype="Fitted")) + 
geom_abline(intercept=0, slope=1, aes(colour="Ideal", linetype="Ideal")) + 
scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) + 
scale_linetype_manual(name="Lines", 
         values=c("Ideal"="solid", "Fitted"="twodash")) + 
scale_x_continuous(name="Control", limits=xy.range) + 
scale_y_continuous(name="Evaluation", limits=xy.range) + 
opts(title="Method Comparison") 
p 

Realmente les agradezco a todos ustedes tomarse el tiempo para responder. Si bien hay una lógica para lo que funciona, no habría llegado allí con prueba y error. Hice cambiar el código un poco para Final:

  • geom_point realizado última modo que los puntos no se sobreescriben
  • mantuvo llamadas a escala continua, de modo que los límites de ejes X e Y forzados a ser el mismo
  • nota similar, añadió aspect.ratio = 1, ahora línea ideal va de esquina a esquina en un ángulo de 45 ° al la Cleveland

código final:

ggplot(df, aes(x=x, y=y)) + 
    geom_smooth(method=lm, se=FALSE, size=1, aes(colour="Fitted", linetype="Fitted")) + 
    geom_smooth(method=lm, fill="red", colour="red", linetype="twodash", size=1) + 
    geom_line(data = data.frame(x=0, y=0), aes(colour = "Ideal", linetype = "Ideal"), size=1) + 
    #geom_abline(intercept=0, slope=1, aes(colour = "Ideal", linetype = "Ideal"), size=0) + 
    geom_abline(intercept=0, slope=1, colour = "blue", linetype = "solid", size=1) + 
    geom_point(shape=ifelse(nrow(df)>49, 1, 16)) + 
    scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) + 
    scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) + 
    scale_x_continuous(name="Control", limits=xy.range) + 
    scale_y_continuous(name="Evaluation", limits=xy.range) + 
    opts(title="Method Comparison", aspect.ratio=1) + 
    theme_bw() 
+0

Una línea es para el buen y el otro es para abline. En cuanto a cómo arreglar la leyenda, lo que haría es no hacer ninguna leyenda con la trama real. Luego falsifique algunos datos y use geom_line para trazarlos con una leyenda. Pero eso es solo una solución. –

Respuesta

5

Como señala @Iselzer en un comentario, las dos líneas son para abline y smooth.

Para obtener el fondo de leyenda para tener un relleno blanco, tiene que engañar a ggplot de la siguiente manera:

  • crear una capa geom_smooth con relleno asignada a un color
  • crear un segundo, casi idéntica, geom_smooth capa, pero esta vez con un relleno blanco, no se asignan a una leyenda:

El código:

p=ggplot(df, aes(x=x, y=y)) + 
    geom_point(shape=ifelse(nrow(df)>49, 1, 16)) + 
    geom_smooth(method=lm, fill="white", aes(colour="Fitted", linetype="Fitted")) + 
    geom_smooth(method=lm, fill="red") + 
    geom_abline(intercept=0, slope=1, aes(colour="Ideal", linetype="Ideal")) + 
    scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) + 
    scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) + 
    opts(title="Method Comparison") + 
    labs(x="Control", y="Evaluation") + 
    theme_bw() 

Tenga en cuenta también que puede simplificar un poco su código usando labs() para crear las etiquetas. Esto significa que no tiene que volver a crear las escalas.

enter image description here

0

Esta es mi opinión Ussing código de Andrie sin las dos líneas en la leyenda

ggplot(df, aes(x=x, y=y)) + 
    geom_point(shape=ifelse(nrow(df)>49, 1, 16)) + 
    geom_smooth(method=lm, fill="white", aes(colour="Fitted", linetype="Fitted")) + 
    geom_smooth(method=lm, fill="red") + 
    geom_abline(intercept=0, slope=1, colour = "blue", linetype = "solid") + 
    geom_line(data = data.frame(x=0, y=0), aes(colour = "Ideal", linetype = "Ideal")) + 
    scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) + 
    scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) + 
    opts(title="Method Comparison") + 
    labs(x="Control", y="Evaluation") + 
    theme_bw() 

espero que el mejor en el control de leyenda en la nueva versión de ggplot va a evitar este tipo de truco.

2

En realidad, hay una manera de cambiar esto sin la adición de la solución cobarde:

p + theme(legend.key = element_rect(color=NA, fill="white")) 
Cuestiones relacionadas