2011-03-02 138 views
8

假设我们有以下简单的日期 - 值对数据框,其中某些日期在序列中缺失(即1月12日至1月14日)。绘制点时,它会在x轴上显示这些缺失的日期,但没有与这些日期对应的点。我想防止这些缺失的日期出现在x轴上,以便点序列没有中断。有关如何做到这一点的任何建议?谢谢!R + ggplot2:如何从x轴隐藏缺失日期?

dts <- c(as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16'))) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

enter image description here

回答

8

关闭日期数据转换成一个因素呢。目前,ggplot正在解释你所告诉数据的意义 - 连续的日期范围。你不希望这样的规模,你想有一个明确的尺度:

require(ggplot2) 
dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

df <- data.frame(dt = factor(format(dts, format = '%d%b')), 
        val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

主要生产: enter image description here

这是你想要的吗?

+0

@Gavin,谢谢...但改变日期为显示:我有10月1日至16日,现在我们得到2月1日至5月1日。有什么办法解决这个问题?我想我可以将日期当作字符串来处理,并且完全丢失日期语义,但是有没有一种方法可以让我不会丢失日期语义? – 2011-03-02 15:14:58

+0

但这些是连续的日期,而不是原始问题中的那一个。 – 2011-03-02 15:14:59

+0

我注意到,忘了按照原始尺度格式化日期。我的错 - 现在看到答案。 – 2011-03-02 15:22:31

5

第一个问题是:你为什么要这么做?如果您的坐标轴不是坐标,则无法显示基于坐标的绘图。如果你真的想这样做,你可以转换成一个因素。要小心,因为尽管顺序:

dts <- c(as.Date(c('31-10-2011', '01-11-2011', '02-11-2011', 
      '05-11-2011'),format="%d-%m-%Y")) 
dtsf <- format(dts, format= '%d%b') 
df <- data.frame(dt=ordered(dtsf,levels=dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

有了因素,你必须要小心,因为顺序是任意的一个因素,除非你让一个有序的因素。由于缺省情况下,因素按字母顺序排列,因此可能会遇到某些日期格式的问题。所以要小心你的工作。如果你不采取顺序进去,你会得到:

df <- data.frame(dt=factor(dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

+0

金融时间系列在周末没有数据是很常见的,所以在周末有阴谋的情况下,在视觉上并不好。 – 2011-03-02 15:18:28

+0

@Prasad:我明白了。我宁愿在X轴上添加诸如“工作日”之类的东西,因为现在您给出的是X轴上实际上不连续的连续函数的印象。听起来像挑剔的,但它可以很混乱。 – 2011-03-02 15:23:05

+0

订购因素+1积分 – 2011-03-02 15:46:40

7

我做了一个做这个。它叫做bdscale,它在CRANgithub。无耻的插头。

要复制你的例子:

> library(bdscale) 
> library(ggplot2) 
> library(scales) 
> dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=dts, labels=date_format('%d%b')) 

replicate example

但你可能想要的是加载已知的有效日期,然后使用在x轴的有效日期,展现您的数据:

> nyse <- bdscale::yahoo('SPY') # get valid dates from SPY prices 
> dts <- as.Date('2011-01-10') + 1:10 
> df <- data.frame(dt=dts, val=seq_along(dts)) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=nyse, labels=date_format('%d%b'), max.major.breaks=10) 

Warning message: 
Removed 3 rows containing missing values (geom_point). 

better

The警告是告诉你它去掉三个日期:

  • 15 =周六
  • 16 =周日
  • 17 = MLK日
+1

只是一个小小的改正,你创建了一个*包*来做到这一点(不是库) – 2014-10-28 15:04:21

+1

我有一个_package_给你** **在这里**,哥们。噢,你好。但你是正确的先生,我会修改。 – dvmlls 2014-10-28 15:07:52