比方说,我有一个数据框,其中包含365个变量的观测值和365个日期,一年中的每一天。
我想使用ggplot绘制此序列,但我希望该图在一年中的任意日期开始,并绘制所有365个观测值,且起始点之前的日期出现在序列的末尾。
对于数据框本身或情节美学,我该怎么办?
下面是示例代码,该代码应说明我最终如何解决此问题。
#ten years of data ordered by hydro year
dates <- seq(as.Date("2000-10-01"), as.Date("2010-10-01"), by="days")
values <- runif(3653)
df = data.frame(Date=as.Date(dates), Val=values)
> head(df)
Date Val
1 2000-10-01 0.9868603
2 2000-10-02 0.6461032
3 2000-10-03 0.7823848
4 2000-10-04 0.9914216
5 2000-10-05 0.8171412
6 2000-10-06 0.3213551
#created new df containing the average of all ten years of measurements for each day of the year
df2 <- df %>% mutate(Day=day(dates), Month =month(dates)) %>%
group_by(Month, Day) %>%
summarize(Multiyearmean=mean(Val))
> head(df2)
# A tibble: 6 x 3
# Groups: Month [1]
Month Day Multiyearmean
<dbl> <int> <dbl>
1 1 1 0.272
2 1 2 0.577
3 1 3 0.269
4 1 4 0.534
5 1 5 0.607
6 1 6 0.649
我的值仍与正确的月和日日期相关联,但是现在它们按顺序从1月到12月而不是从10月到9月排序。
这种解释正确吗?
如何重新排序以进行打印?
如何在不破坏日期顺序的情况下完成multiyearmean as described here的创建?
答案 0 :(得分:2)
与其他答案有些相似,但使用的是模拟方法:
set.seed(2018 - 11 - 25) # reproducible data
data.frame(
dates = seq(as.Date("2000-10-01"), as.Date("2010-10-01"), by = "days"),
values = runif(3653)
) -> xdf
mutate(
xdf,
day = lubridate::day(dates),
month = lubridate::month(dates)
) %>%
group_by(month, day) %>%
summarize(multi_year_mean = mean(values)) %>%
ungroup() %>%
mutate(plot_date = case_when( # use "real" date axis and wrap-around
month >= 10 ~ as.Date(sprintf("2019-%02s-%02s", month, day)),
TRUE ~ as.Date(sprintf("2020-%02s-%02s", month, day)) # account for leap year(s)
)) %>%
ggplot(aes(plot_date, multi_year_mean)) +
geom_point() +
scale_x_date(expand=c(0,0.75), date_breaks = "1 month", date_labels = "%b") # adjust aesthetics as necessary
答案 1 :(得分:1)
编辑:原始答案创建了虚假数据,因为OP中最初没有提供。现在使用建议的df
示例数据。 (感谢添加,顺便说一句!简化了回答。)
我建议您调整日期,使其从10月1日到下一个9月30日为连续范围。这样,您就可以使用日期在ggplot
中进行绘制,但可以根据需要进行调整。
例如,获取您的数据,我们可以将其调整为进入10月至9月的一年(到2020年结束,因此我们捕获2月29日)。
df2b <- df %>%
mutate(date_hydro = lubridate::ymd(paste(
if_else(month(Date) < 10, 2020, 2019), # 2020 is leap year
month(Date), day(Date))
)) %>%
group_by(date_hydro) %>%
summarize(multiyearmean = mean(Val))
然后我们可以绘制水文年内的每日平均值。
ggplot(df2b, aes(date_hydro, multiyearmean)) +
geom_point() +
scale_x_date(date_labels = "%b", date_breaks = "1 month",
minor_breaks = NULL) +
theme(axis.text.x = element_text(hjust = 0))