R:ggplot2 - 根据主要 'month' x 日期轴缩放次要 'year quarter' x 日期轴

R: ggplot2 - Scaling a secondary 'year quarter' x date axis based on a primary 'month' x date axis

我想要两个 x 轴。其中一个(最好是主要的)有年季度,第二个有月份。我正在尝试这样做,因为我的日期观察结果不是 uniform/sequential。即我在第一季度只能有 1 月,但在第二季度可以有整整 3 个月。

我的尝试是使用 scale_x_date,日期采用标准日期格式 (as.Date()),并使用 date_labelsbreaks。 对于辅助轴,我使用了 dup_axis 并通过了 zoo::as.yearqtr

library("zoo")
library("ggplot2")
set.seed(44)

## Creating a reproducible data-frame ##

df <- data.frame("id" = sample(1:100, 3, replace=TRUE),
                 "date" = c("2020-01-01","2020-02-01","2020-03-01",
                            "2020-04-01",
                            "2020-07-01","2020-09-01",
                            "2020-10-01","2020-11-01","2020-12-01")
                 )
## Plotting ##
df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(date_labels = "%b", breaks = "1 month",
               sec.axis = dup_axis(name = "month", breaks = scales::date_breaks("3 month"),  labels = as.yearqtr)
               )
}

这是我尝试的情节图片:

我在这里面临的缺点:

  1. 正在绘制最后 3 个月的季度(即它将 匹配三月),我希望它匹配一月。

额外 - 其他低严重性问题是:

  1. 所有日期都标出来了,我猜是因为我在用 scale_x_date 我们应该使用 scale_x_discrete .. 如果我们只为存在的点写标签会很有帮助,否则我 观众可以 match/interpret 用他的眼睛点。

  2. 这是最低的严重性,但我想传递参数 运行 as.yearqtr 以便我可以格式化季度。即这将 yield as.yearqtr(Sys.Date()) %>% format("%y Q%q") "20 Q2" 代替 的“2020 年第二季度”

我换个角度尝试,解决方法如下:

1- 对于主要问题,解决方案是使用 sec_axis 而不是 dup_axis

附加 - 其他低严重性解决方案是:

1- 为了仅绘制现有观察结果,我使用了 unique()。这列在那个 SO 线程

2- 从函数 as.yearqtr 文档中,我可以看到 format 作为函数参数,但是传递参数不起作用,所以我使用了这个解决方法 labels = function(x) format(as.yearqtr(x),"%y Q%q")。感谢@Axeman 提供 syntax/way.

df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(breaks = unique(as.Date(.$date)), date_labels = "%b",
               sec.axis = sec_axis(name = "quarter", trans = ~ ., labels = function(x) format(as.yearqtr(x),"%y Q%q"))
  ) +
  xlab("month")
}

解图结果: