【问题标题】:Shade several areas of a time series plot: error using geom_rect对时间序列图的多个区域进行着色:使用 geom_rect 时出错
【发布时间】:2018-06-07 20:48:38
【问题描述】:

我正在尝试使用“geom_rect”对时间序列图的几个部分进行着色。但是,我收到错误消息“Error in as.Date.default(date) : do not know how to convert 'date' to class “Date”。为什么 ?以及如何解决这个问题?

这是一个可重现的例子:

  library(ggplot2)
  dat <- data.frame(date=seq.Date(as.Date('2005-01-01'), as.Date('2016-12-31'),length.out=100), y=runif(100)) 
  print(dat)
  block <- data.frame(level = c('A','B', "C"), 
                       ymn = -Inf, 
                       ymx = Inf,
                       xmn = c(as.Date('2006-01-01'), as.Date('2010-01-01'), as.Date('2014-01-01')),
                       xmx = c(as.Date('2006-12-31'), as.Date('2010-12-31'), as.Date('2014-12-31')))
  print(block)

  ggplot(data=dat, aes(x=as.Date(date), y=y)) + 
    geom_line(size = 1) +
    geom_rect(data=block,aes(xmin=as.Date(xmn),xmax=as.Date(xmx),ymin=ymn,ymax=ymx, fill=level), alpha = 0.3)

【问题讨论】:

  • 您可能需要inherit.aes = FALSE 中的geom_rect。它可能会看到您定义的全局 x
  • date 列已经是一个 Date 对象,block 中的日期列也是如此。去掉你所有的aes 中的as.Date 调用,这样就可以了
  • 太棒了!它通过在geom_rect 中添加inherit.aes = FALSE 来工作!非常感谢您的帮助!

标签: r ggplot2 time-series


【解决方案1】:

这将起作用:

ggplot(data=dat, aes(x=as.Date(dat$date), y=dat$y))

ggplot(data=dat, aes(x=dat$date, y=dat$y))

下一个选项也可以:

ggplot(data=dat, aes(x=as.Date(dat$date), y=dat$y)) + 
  geom_line(size = 1)

但您真正的问题是 block 对象的形状与您使用它的方式不匹配 data,但这是一个不相关的问题。

【讨论】:

  • aes里面引用数据框的名字,比如y = dat$y,真的很容易出bug
  • @camille 你能具体点吗?我从未遇到过任何错误
  • 有很多 SO 帖子在 ggplot 中发生了一些奇怪的事情,事实证明问题是使用 aes 中的数据框名称引入的范围界定问题。 ggplot 期望得到裸列名,所以你最好给它想要的东西。这是一篇说明这一点的帖子:stackoverflow.com/questions/22244500/…
猜你喜欢
  • 2016-06-21
  • 2015-06-21
  • 2021-08-24
  • 1970-01-01
  • 2019-09-02
  • 2015-11-08
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多