如何在ggplot上绘制月份日期而不是r中的年份日期

ogsagwnx  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(135)

我需要创建一个图,显示两组的最早和最晚日期之间的范围。有不同的年份,但我只对定义为月-日的日期感兴趣(即Feb-04),而不考虑年份。当将月-日定义为儒略日时,我可以做到这一点,但我想使用月-日格式(即Feb-04)。
这是我在Julian日期中工作时获得的代码和输出:

library(dplyr)

data.1 <-read.csv(text = "
trt,full_date
A,10/06/2020
A,09/19/2017
A,10/28/2014
A,09/02/2016
A,09/19/2017
A,09/26/2017
B,08/24/2020
B,09/24/2020
B,10/16/2018
B,09/16/2018
B,09/15/2016
B,09/09/2018
")

#day of year option
data.2 <- data.1 %>%
  mutate(full_date = as.Date(full_date, format("%m/%d/%Y")),
         full_date.doy = as.numeric(strftime(full_date, format = "%j"))) %>%
  group_by(trt) %>%
  summarise(earliest.doy = min(full_date.doy),
            latest.doy = max(full_date.doy))
                                  
ggplot(data.2) +
  geom_segment( aes(x=trt, xend=trt, y=earliest.doy, yend=latest.doy), color="grey") +
  geom_point( aes(x=trt, y=earliest.doy), color=rgb(0.2,0.7,0.1,0.5), size=3 ) +
  geom_point( aes(x=trt, y=latest.doy), color=rgb(0.7,0.2,0.1,0.5), size=3 ) +
  coord_flip() +
  ylab("Day of the year")

输出:

我想要的是这个(x轴上的日期是近似的:

我遇到的第一个问题是最早和最晚日期的计算。对于trt="A",最早和最晚日期是错误的。

问题是date_mm.dd似乎是字符格式,我找不到更改日期的方法。这样,情节就错了:

任何提示都将不胜感激。

hxzsmxv2

hxzsmxv21#

解决这个问题的一种方法是将您的doy变量转换为任意年份的日期,如2022年。在这里,第一天将是2021-12-31之后的一天,即2022年1月1日。
(2022不是闰年,所以在闰年2月28日之后的日期将提前一天表示。即2月29日,当它发生时,是一年的第60天,但在大多数年份,如2022年,3月1日是第60天,所以它会显示在那里。根据上下文,您可能会对此进行调整。

data.2 %>%
  mutate(across(contains("doy"), ~as.Date("2021-12-31") + .x))

这是让dplyr将相同的函数应用于任何名称包含字符串“doy”的列的快捷方式。我们可以等效地用途:

data.2 %>%
  mutate(earliest.doy = as.Date("2021-12-31") + earliest.doy))
  mutate(latest.doy   = as.Date("2021-12-31") + latest.doy))

结果

# A tibble: 2 × 3
  trt   earliest.doy latest.doy
  <chr> <date>       <date>    
1 A     2022-09-03   2022-10-28
2 B     2022-08-25   2022-10-16

然后你可以把它输入到你现有的代码中:

... %>%
  ggplot()+
  geom_segment( aes(x=trt, xend=trt, y=earliest.doy, yend=latest.doy), color="grey") +
  geom_point( aes(x=trt, y=earliest.doy), color=rgb(0.2,0.7,0.1,0.5), size=3 ) +
  geom_point( aes(x=trt, y=latest.doy), color=rgb(0.7,0.2,0.1,0.5), size=3 ) +
  coord_flip() +
  ylab("Day of the year")

相关问题