我有一个散布图,使用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))
答案 0 :(得分:1)
您在使用日期时遇到问题。它们并不是真正的连续或离散。因此scale_x_continous
和scale_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创建