如何在ggplot中移动X轴的起点?

时间:2018-11-25 22:19:31

标签: r ggplot2

比方说,我有一个数据框,其中包含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的创建?

2 个答案:

答案 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

enter image description here

答案 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))

enter image description here