自定义休息时间和标签在日期轴上缺失

时间:2019-11-28 12:40:48

标签: r ggplot2

我有一个散布图,使用ggplot制作,在x轴上显示日期(涵盖8周),并带有随机点。我希望测试日期的中间有一条垂直线,并且每2周(向前和向后)标记一次。下面是一个最小的工作示例。

我已按照http://www.sthda.com/english/wiki/ggplot2-axis-ticks-a-guide-to-customize-tick-marks-and-labels指定了休息时间和标签。

但是它们没有出现...

Test = '2010-05-02'
data = data.frame(x=-28:28)
data$date = as.Date(Test)+data$x
data$y = sample(1:6, size=57, replace=TRUE)

ggplot(data) +
  geom_point(aes(date, y, color=y), alpha=0.45, size=1.2) +
  geom_vline(xintercept=as.Date(Test), color = '#0B50EF', linetype='twodash', size = 0.70) +
  theme_bw(7) + 
  theme(legend.position = "none") +  
  xlab('') +
  ylab('') +
  scale_x_discrete(breaks=c(as.Date(Test)-28,as.Date(Test)-14,as.Date(Test),as.Date(Test)+14,as.Date(Test)+28), 
                   labels=c(as.Date(Test)-28,as.Date(Test)-14,as.Date(Test),as.Date(Test)+14,as.Date(Test)+28))

1 个答案:

答案 0 :(得分:1)

您在使用日期时遇到问题。它们并不是真正的连续或离散。因此scale_x_continousscale_x_discrete都不会像超级按钮那样工作。 挑战在于字符和日期类之间的转换。 在我的示例中,从一开始创建“ Test”作为Date类开始,我就将所有内容都保留为Date。为了使您的代码更清晰,我事先使用seq创建了中断向量。当然,还有更多的电子方式。我还删除了与该问题无关的所有冗余代码。

library(tidyverse)

Test = as.Date('2010-05-02') #makes your life easier
data = data.frame(x=-28:28)
data$date = Test + data$x
data$y = sample(1:6, size=57, replace=TRUE)

my_breaks <- c(seq(Test-28,'2 weeks', to =Test), 
               seq(Test,'2 weeks', to =  Test + 28))

ggplot(data) +
  geom_point(aes(date, y)) +
  geom_vline(xintercept = as.Date(Test)) +
  scale_x_date(breaks = my_breaks)

reprex package(v0.3.0)于2019-11-28创建