【问题标题】:How to get geom_vline and facet_wrap from ggplot2 to work inside a function如何从 ggplot2 获取 geom_vline 和 facet_wrap 在函数内工作
【发布时间】:2010-02-16 01:59:23
【问题描述】:

我正在使用 ggplot2 来探索不同军事行动对谋杀率的影响。为了显示效果,我画了一条手术发生时的垂直线和一条手术前后谋杀率的平滑线。

我已经编写了一个 facet_wrap 图来为一大堆县展示这一点。它工作得很好,但是当转换为函数时,使用局部变量绘制垂直线时出现错误。

下面是一些示例代码:

drawTS <- function(df, dates, text) {
    p <- ggplot(df, aes(date, murders)) +
      facet_wrap(~ county, ncol = 1,
                 scale="free_y") +
      scale_x_date() +
      geom_smooth(aes(group = group), se = FALSE)
    for(i in 1:length(dates)) {
      #If it's not a global variable I get an object not found error
      temp[i] <<- dates[i]
      p <- p + geom_text(aes(x,y), label = text[i],
                  data = data.frame(x = dates[i], y = -10),
                  size = 3, hjust = 1, vjust = 0) +
           #Here's the problem
           geom_vline(xintercept=temp[i], alpha=.4)
    }
    p
}

library(ggplot2)
df <- data.frame(date = rep(seq(as.Date("2007/1/01"),
                          length=36, by='1 month'),4),
               murders = round(runif(36*4) * 100),
               county = rep(rep(factor(1:4),9),each=4),
               group = rep(c(rep(1,6), rep(2,12),rep(3,18))), each=4)
dates <- c(as.Date("2007/6/15"), as.Date("2008/6/15"))
temp <- c()
drawTS(df, dates, c("Op 1","Op 2"))

全局变量没有错误,但看起来很难看。

如果我在geom_vline() 中使用dates[i] 而不是temp[i] 变量,我得到这个:

NextMethod("[") 中的错误:找不到对象 'i'

如果我将变量 dates[i] 包装在 aes() 中,我会得到:

eval 中的错误(expr、envir、enclos):找不到对象“县”

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我不知道是什么导致了错误,但我可以想出一个解决方法是用这样的数据框替换 for 循环:

    date.df<-data.frame(d=dates,t=text)
    p <- p + geom_text(aes(x=d,label=t),y=0,
                       data = date.df,
                       size = 3, hjust = 1, vjust = 0)
    p<-p+geom_vline(aes(xintercept=d),data=date.df,alpha=.4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多