2010-02-12 12 views
5

Uso de ggplot2 Estoy trazando varias funciones y una serie de puntos. No puedo entender cómo representar los puntos en la leyenda. Me doy cuenta de que necesito usar una función aes(), pero no entiendo completamente cómo hacer esto. Me disculpo por el hecho de que el ejemplo es muy largo, pero no sé cómo ilustrarlo.Usando ggplot2 cómo puedo representar un punto y una línea en la leyenda

## add ggplot2 
library(ggplot2) 

# Declare Chart values 
y_label = expression("y_axis"~~bgroup("(",val/km^{2},")")) 
x_label = "x_axis" 

############################# 
## Define functions 
# Create a list to hold the functions 
funcs <- list() 
funcs[] 

# loop through to define functions 
for(k in 1:21){ 

# Make function name 
funcName <- paste('func', k, sep = '') 

# make function 
func = paste('function(x){exp(', k, ') * exp(x*0.01)}', sep = '') 

funcs[[funcName]] = eval(parse(text=func)) 

} 

    # Specify values 
    yval = c(1:20)        
    xval = c(1:20)         

    # make a dataframe 
    d = data.frame(xval,yval) 

    # Specify Range 
    x_range <- range(1,51) 

# make plot 
p <-qplot(data = d, 
     x=xval,y=yval,   
     xlab = x_label, 
     ylab = y_label, 
     xlim = x_range 
     )+ geom_point(colour="green") 


for(j in 1:length(funcs)){ 

p <- p + stat_function(aes(y=0),fun = funcs[[j]], colour="blue", alpha=I(1/5)) 

} 

# make one function red 
p <- p + stat_function(fun = funcs[[i]], aes(color="red"), size = 1) + 
    scale_colour_identity("", breaks=c("red", "green","blue"), 
    labels=c("Fitted Values", "Measured values","All values")) 

# position legend and make remove frame 
p <- p + opts(legend.position = c(0.85,0.7), legend.background = theme_rect(col = 0)) 

print(p)  

Gracias de antemano: He aprendido mucho de esta comunidad en los últimos días.

Respuesta

8

ver más abajo para una solución. La idea principal es la siguiente: imagina los puntos que tienen una línea invisible debajo de ellos, y las líneas que tienen puntos invisibles. De modo que cada "serie" obtiene atributos de color y forma y tipo de línea, y al final los estableceremos manualmente en valores invisibles (0 para líneas, NA para puntos) según sea necesario. ggplot2 fusionará las leyendas para los tres atributos automáticamente.

# make plot 
p <- qplot(data = d, x=xval, y=yval, colour="Measured", shape="Measured", 
      linetype="Measured", xlab = x_label, ylab = y_label, xlim = x_range, 
      geom="point") 

#add lines for functions 
for(j in 1:length(funcs)){ 
    p <- p + stat_function(aes(colour="All", shape="All", linetype="All"), 
          fun = funcs[[j]], alpha=I(1/5), geom="line") 
} 

# make one function special 
p <- p + stat_function(fun = funcs[[1]], aes(colour="Fitted", shape="Fitted", 
         linetype="Fitted"), size = 1, geom="line") 

# modify look 
p <- p + scale_colour_manual("", values=c("green", "blue", "red")) + 
      scale_shape_manual("", values=c(19,NA,NA)) + 
      scale_linetype_manual("", values=c(0,1,1)) 

print(p) 
+0

¡Felicidades! –

+0

Gracias, eso es lo que quería lograr. – djq

3

Establecer la estética del color para cada geom a una constante puede ayudar. He aquí un pequeño ejemplo:

require(ggplot2) 
set.seed(666) 
N<-20 
foo<-data.frame(x=1:N,y=runif(N),z=runif(N)) 
p<-ggplot(foo) 
p<-p+geom_line(aes(x,y,colour="Theory")) 
p<-p+geom_point(aes(x,z,colour="Practice")) 

#Optional, if you want your own colours 
p<-p+scale_colour_manual("Source",c('blue','red')) 

print(p) 

alt text http://img59.imageshack.us/img59/5460/fooplot.png

+0

¿Es posible obtener esto sin la línea? Esperaba tener el punto en la leyenda para la categoría 'práctica'. Gracias. – djq

+0

Establezca el color como una opción en lugar de como una estética mapeada para la línea, es decir, cambie las tres líneas antes de la impresión a: p <-p + geom_line (aes (x, y), col = 'blue'); p <-p + geom_point (aes (x, z, color = "rojo")); p <-p + scale_colour_identity ("Legend", labels = "Practice", breaks = "red") –

+0

Aún no es lo que espero lograr, ya que solo produce un punto rojo en la leyenda. Quiero tanto "Teoría" como "Práctica", pero una línea azul para "Teoría" y un punto rojo para "Practicar". Gracias por la sugerencia, sin embargo. – djq

1

Esto no es compatible de forma nativa en ggplot2, pero espero que encuentre la forma de una futura versión.

Cuestiones relacionadas