首页 > 解决方案 > x 轴作为周数,辅助 x 轴作为日期

问题描述

我正在尝试在 ggplot 中绘制一个时间序列,其中主要 x 轴作为数字,次要 x 轴作为日期。这是我可怜的尝试。

library(tidyverse)

tibble::tribble(
  ~date,  ~ndvi,
  "2020-05-18", 0.7655,
  "2020-06-14",  0.723,
  "2020-07-12", 0.6178,
  "2020-08-21",  0.437,
  "2020-09-07", 0.4763,
  "2020-09-10", 0.4928,
  "2020-09-12", 0.4831,
  "2020-09-22", 0.4774,
  "2020-10-02", 0.5794,
  "2020-10-07",  0.606
) %>% 
  mutate(date = lubridate::ymd(date),  
         weeks = difftime(date, min(date), units="weeks")) %>% 
  ggplot(aes(weeks, ndvi)) +
  geom_line()+
  scale_x_datetime(
    sec.axis = dup_axis(name = "", #breaks = date, 
                        labels = scales::time_format("%b")))

#> Error: Invalid input: time_trans works with objects of class POSIXct only

这是所需的输出,其中主要 x 轴有几周,次要 x 轴有时间序列的月份

在此处输入图像描述

标签: rggplot2

解决方案


分别为两个 x 轴设置标签。也请检查这个讨论

library(tidyverse)

mydat <- tibble::tribble(
  ~date,  ~ndvi,
  "2020-05-18", 0.7655,
  "2020-06-14",  0.723,
  "2020-07-12", 0.6178,
  "2020-08-21",  0.437,
  "2020-09-07", 0.4763,
  "2020-09-10", 0.4928,
  "2020-09-12", 0.4831,
  "2020-09-22", 0.4774,
  "2020-10-02", 0.5794,
  "2020-10-07",  0.606
)  %>% 
  mutate(date = lubridate::ymd(date),  
         weeks = as.numeric(difftime(date, min(date), units="weeks")))

 mydat %>%
  ggplot(aes(date, ndvi)) +
  geom_line() +
  scale_x_date(date_breaks = "4 weeks", labels = scales::date_format("%W"),
    sec.axis = dup_axis(name = "", labels = scales::date_format("%b")))

reprex 包于 2021-02-10 创建(v1.0.0)


推荐阅读