2010-02-12 16 views
5

Utilizzo di ggplot2 Sto tracciando diverse funzioni e una serie di punti. Non riesco a capire come rappresentare i punti sulla leggenda. Mi rendo conto che ho bisogno di usare una funzione aes(), ma non capisco appieno come farlo. Mi scuso che l'esempio è così lungo, ma non so in quale altro modo illustrarlo.Utilizzo di ggplot2 come posso rappresentare un punto e una linea nella legenda

## 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)  

Grazie in anticipo - Ho imparato molto da questa community negli ultimi giorni.

risposta

8

Vedi sotto per una soluzione. L'idea principale è la seguente: immagina i punti che hanno una linea invisibile sotto di loro e le linee che hanno punti invisibili. Quindi ogni "serie" ottiene gli attributi di colore e forma e tipo di linea, e alla fine li imposteremo manualmente su valori invisibili (0 per linee, NA per punti) se necessario. ggplot2 fonderà automaticamente le legende per i tre attributi.

# 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

Congratulazioni !! –

+0

Grazie - è quello che volevo ottenere. – djq

3

L'impostazione dell'estensione del colore per ogni geom su una costante può essere d'aiuto. Ecco un piccolo esempio:

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

È possibile ottenere questo senza la linea? Speravo di avere il punto nella legenda per la categoria 'pratica'. Grazie. – djq

+0

Imposta il colore come opzione anziché come estetico mappato per la linea, ovvero modifica le tre linee prima della stampa su: p <-p + geom_line (aes (x, y), col = 'blue'); p <-p + geom_point (aes (x, z, color = "red")); p <-p + scale_colour_identity ("Legend", labels = "Practice", breaks = "red") –

+0

Non è ancora quello che spero di ottenere in quanto produce solo un punto rosso nella legenda. Voglio sia "Theory" che "Practice" ma una linea blu per "Theory" e un punto rosso per "Practice". Grazie per il suggerimento, però. – djq

1

Questo non è supportato in modo nativo in ggplot2, ma spero di capire come fare per una versione futura.

Problemi correlati