我想有两个x轴。其中一个(主要是首选)具有年份季度,第二个具有月份。我正在尝试执行此操作,因为我的日期观测值不是统一的/顺序的。即我在第一季度只能有1月,但是在第二季度可以有整个3个月。
[我的尝试是使用具有标准日期格式(scale_x_date
)的日期的as.Date()
,并使用date_labels
和breaks
。对于辅助轴,我使用了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)
)
}
我在这里面临的弊端:
其他-其他低严重性问题是:
绘制所有日期,我想是因为我正在使用scale_x_date
,我们应该使用scale_x_discrete
..如果我们只为存在的点写标签,则很有帮助,否则我会观众可以用眼睛匹配/解释这些点。
这是最低的严重性,但我想传递参数功能as.yearqtr
,所以我可以格式化四分之一。即这将产生as.yearqtr(Sys.Date()) %>% format("%y Q%q")
改为“ 20 Q2”2020年第二季度”
我已将尝试更改为另一个角度,解决方案如下:
1-对于主要问题,解决方案是使用sec_axis
而不是dup_axis
。
额外-其他低严重性解决方案是:
1-为了仅绘制现有观测值,我使用了unique()
。在该SO线程link
2-从函数as.yearqtr
文档中,我可以看到format
作为函数参数,但是传递参数无效,因此我使用了此解决方法labels = function(x) format(as.yearqtr(x),"%y Q%q")
。感谢@Axeman提供语法/方式。
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")
}