2012-04-16 78 views
4

我有一个有趣的难题。我可以创建交互式查找的图表类型,但不能自动创建。或者,我几乎是自动的,但有些东西坏了。 (在帖子结尾的示例数据)。奇怪“提供给scale_x_continuous错误的非连续变量”

我有我的循环工作我想要的方式,但当我添加一些geom_vline()语句(对我们来说,表示我们的生产环境中的重大变化)时遇到错误。我试过在循环之外完成它,并能够用下面的细节重新创建问题。

我有以下步骤:

  • 创建与列表中的改变的矢量:

changeVector <- c(as.Date("2011-11-30"),as.Date("2011-12-05"))

  • [WORKS]创建与下面的数据的曲线图,它作品:

ggplot(df,aes(x=OBSDATE,y=AVG_RESP))+geom_line(aes(group=REGION,color=REGION))

  • [作品]尝试添加geom_vline(xintercept = C(15308,15313)),以及它的工作原理(但仅如果geom_vline是在端部):

ggplot(df,aes(x=OBSDATE,y=AVG_RESP))+geom_line(aes(group=REGION,color=REGION))+geom_vline(xintercept=c(15308,15313))

  • [FAIL]尝试添加geom_vline(xintercept = changeVector) - 我有这种出于某种原因的问题,不得不添加as.numeric正确识别矢量值:

ggplot(df,aes(x=OBSDATE,y=AVG_RESP))+geom_vline(xintercept=as.numeric(changeVector))+geom_line(aes(group=REGION,color=REGION))

当这一步运行,我得到了奇妙有用的错误消息: Error: Non-continuous variable supplied to scale_x_continuous.

因此,任何想法?如果我尝试在geom_vline中添加审美元素,我仍然没有取得进展。我的愿望是让geom_vline在geom_line之前,因为vline是上下文而不是数据。

谢谢你的帮助!

下面是数据的一个子集(数据文件名,DF):

OBSDATE REGION COUNT AVG_RESP 
2011-11-29  EMEA 293 4.430375 
2011-11-30  EMEA 299 4.802876 
2011-12-01  EMEA 292 4.362363 
2011-12-02  EMEA 293 4.209829 
2011-12-03  EMEA 294 4.262959 
2011-12-04  EMEA 294 4.207959 
2011-12-05  EMEA 293 4.172594 
2011-12-06  EMEA 293 4.230887 
2011-12-07  EMEA 298 4.259329 
2011-12-08  EMEA 293 4.197645 
2011-11-29 Americas 296 2.841182 
2011-11-30 Americas 296 2.932196 
2011-12-01 Americas 292 2.766438 
2011-12-02 Americas 293 2.819556 
2011-12-03 Americas 291 2.710584 
2011-12-04 Americas 295 2.728407 
2011-12-05 Americas 290 2.764310 
2011-12-06 Americas 290 2.817483 
2011-12-07 Americas 295 2.733864 
2011-12-08 Americas 291 2.732405 
2011-11-29  APAC 328 7.294024 
2011-11-30  APAC 325 7.091046 
2011-12-01  APAC 314 6.969236 
2011-12-02  APAC 327 6.920428 
2011-12-03  APAC 325 7.226308 
2011-12-04  APAC 324 7.046296 
2011-12-05  APAC 318 7.075094 
2011-12-06  APAC 317 7.016467 
2011-12-07  APAC 318 7.187358 
2011-12-08  APAC 318 7.310220 

回答

4

我不知道是什么原因是这样做的,但这里要说的是保持垂直线后面的解决方法数据线:

ggplot(df,aes(x=OBSDATE,y=AVG_RESP)) + 
    geom_blank() + 
    geom_vline(xintercept=as.numeric(changeVector)) + 
    geom_line(aes(group=REGION,color=REGION)) 

编辑:

这里是另一个解决方法:明确指定的x轴是成为一个约会,而不是有ggplot猜测。当它猜测时,它会查看绘制的第一层,即垂直线。考虑到xintercept必须以数字而不是日期给出,x轴被假定为连续/数字。当绘制下一个图层时,x轴的日期无法映射到该图层上,并引发错误。

ggplot(df,aes(x=OBSDATE,y=AVG_RESP)) + 
    geom_vline(xintercept=as.numeric(changeVector)) + 
    geom_line(aes(group=REGION,color=REGION)) + 
    scale_x_date() 
+0

谢谢,Brian! 似乎有点“哈克”,但如果它有效,它的工作原理! – BenH 2012-04-16 20:09:50

+0

scale_x_date()解决方案让我确信这不是一个错误,甚至有一定的意义。尽管以人们会发现的方式记录下来很难。 – joran 2012-04-16 20:28:08

+0

这个编辑绝对是一个更好的方法。我从来没有想到会这样。 @joran,当使用scale_x_date()时,“as.numeric”不是必需的 - 至少对我来说不是必需的。 – BenH 2012-04-17 02:19:21