Question

Using ggplot2 I am plotting several functions and a series of points. I cannot figure out how to represent the points on the legend. I realize I need to use an aes() function, but I don't fully understand how to do this. I apologize that the example is so long, but I don't know how else to illustrate it.

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

Thank you in advance - I have learned I a lot from this community over the last few days.

Was it helpful?

Solution

See below for a solution. The main idea is the following: imagine the points having an invisible line under them, and the lines having invisible points. So each "series" gets color and shape and linetype attributes, and at the end we will manually set them to invisible values (0 for lines, NA for points) as necessary. ggplot2 will merge the legends for the three attributes automatically.

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

OTHER TIPS

Setting the colour aesthetic for each geom to a constant may help. Here is a small example:

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

This isn't supported natively in ggplot2, but I'm hoping I'll figure out how for a future version.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top