代码之家  ›  专栏  ›  技术社区  ›  djq

使用ggplot2如何表示图例中的点和线

  •  5
  • djq  · 技术社区  · 16 年前

    使用ggplot2,我绘制了几个函数和一系列点。我不知道如何表示图例上的点。我知道我需要使用aes()函数,但我不完全理解如何做到这一点。很抱歉,这个例子太长了,但我不知道该如何解释。

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

    提前谢谢你-在过去的几天里,我从这个社区学到了很多东西。

    3 回复  |  直到 16 年前
        1
  •  8
  •   Aniko    16 年前

    请参阅下面的解决方案。主要思想是:想象点下面有一条看不见的线,线下面有一条看不见的点。因此,每个“系列”都会获得颜色、形状和线型属性,最后我们会根据需要手动将它们设置为不可见值(0表示线,NA表示点)。ggplot2将自动合并三个属性的图例。

    # 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) 
    
        2
  •  3
  •   Jyotirmoy Bhattacharya    16 年前

    将每个风水的颜色美学设置为一个常量可能会有所帮助。下面是一个小例子:

    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

        3
  •  1
  •   Collin    16 年前

    在ggplot2中,本机不支持这一点,但我希望能找到未来版本的实现方法。

    推荐文章