我想要两个x轴。其中一个(小学最好)有年度季度,第二个有月份。我试图做到这一点,因为我的日期观察是不一致的/顺序的。也就是说,我只能让简在Q1,但在Q2的整整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 Q2"发布于 2020-05-29 01:02:11
我已经将尝试更改为另一个视角,解决方案如下:
对于主要的问题,解决方案是使用sec_axis而不是dup_axis。
其他低严重程度的解决方案包括:
为了只绘制现有的观测结果,我使用了unique()。这是在所以线程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")
}解图解结果:

https://stackoverflow.com/questions/62074650
复制相似问题