R - 如何仅使用一个函数初始化*或*添加到ggplot

时间:2014-02-14 23:49:38

标签: r ggplot2

我在R中有一个从网站读取数据并绘制2列的函数。我怎样才能使它第一次运行该函数时初始化一个新图形,但随后的运行(将标有'reset'参数)将向图形添加一组新的点而不是覆盖旧的?

getdata<- function(team,year,reset=F){

#Retrieve/format Data
[..]

#Plot Data
if (reset==T)
{
    p <-ggplot(data, aes(x = no, y = pts)) +
        geom_path(colour="red", size=2) +
        geom_point(colour="black" ,size = 2, shape=21, fill="white") 
        return(p)
}
else
{
     add<-ggplot(data, aes(x = no, y = pts)) +
      geom_path(colour = "blue", size = 2) +
      geom_point(colour="black", size = 2, shape=21,  fill="white")             

              p <- p + add
      return(p)
}

我认为我的问题类似于此处发布的内容:Adding line with points to a plot in ggplot2但我在将其添加为当前现有情节的列表时遇到了一些问题。

我是R的初学者所以可能会做一些愚蠢的事情!

感谢您的帮助,一直在与此搏斗。

1 个答案:

答案 0 :(得分:2)

有一些事情需要发生才能发挥作用:

  1. 您的功能需要作为存储上一个情节的机制
  2. 您想要在图表中添加图层(例如geom_point()),而不是整个ggplot对象
  3. 所以这是一个潜在的实现(注意,未经测试,因为您的示例不可重现):

    make_getdata <- function() {                      # THIS FUNCTION RETURNS A FUNCTION
      p <- NULL                                       # WE WILL STORE PLOT HERE
      function(team,year,reset=F) {
        # get data
        if(reset || is.null(p)) {
          p <<- ggplot(data, aes(x = no, y = pts)) +  # NOTICE DOUBLE ARROW
            geom_path(colour="red", size=2) +
            geom_point(colour="black" ,size = 2, shape=21, fill="white") 
        } else {
          p <<- p +                                   # NOTICE DOUBLE ARROW
            geom_path(data=data, aes(x = no, y = pts), colour = "blue", size = 2) +
            geom_point(data=data, aes(x = no, y = pts), colour="black", size = 2, shape=21,  fill="white")
        }
        return(p)
    } }
    getdata <- make_getdata()   # this creates your `getdata` function and stores it in `getdata`
    getdata(...)
    

    这里的关键是我们利用R的作用域属性创建一个持久变量,我们存储图形。 make_getdata()创建一个函数以及一个函数环境。该环境包含p,我们可以使用<<-来存储我们的地块。