繁体   English   中英

R + ggplot2:如何从x轴隐藏缺少的日期?

[英]R + ggplot2: how to hide missing dates from x-axis?

假设我们有以下简单数据框的日期 - 值对,其中序列中缺少某些日期(即1月12日至1月14日)。 当我绘制点时,它会在x轴上显示这些缺失日期,但没有与这些日期对应的点。 我想防止这些丢失的日期显示在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')

在此输入图像描述

然后将日期数据转换为一个因子。 目前,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()

产生: 在此输入图像描述

那是你想要的吗?

我做了一个这样做的 它叫做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'))

复制的例子

但您可能想要的是加载已知的有效日期,然后使用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). 

更好

警告告诉您它删除了三个日期:

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

第一个问题是:你为什么要这样做? 如果您的轴不是坐标,则显示基于坐标的绘图没有意义。 如果你真的想这样做,你可以转换为一个因素。 但请注意订单:

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()

在此输入图像描述

有了因素,你必须要小心,因为顺序在一个因子中是任意的,除非你把它作为有序因子。 由于因素按字母顺序排序,因此您可能会遇到某些日期格式的问题。 所以要小心你的工作。 如果您不考虑订单,您会得到:

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM