如何用ggh4x的facetted_pos_scales设置facet_wrap后的scale_x_date轴?
问题
使用facet_wrap绘制分面图后,想要针对特定分面修改scale_x_date坐标轴。已知ggh4x包的facetted_pos_scales对scale_x_continuous有效,但尝试以下代码后无法生效:
facetted_pos_scales(x = list(sample_name == 'x' ~ scale_x_date(limits = c(as.Date("2022-07-01"), as.Date("2023-03-01")))))
完整绘图代码如下:
mutate(match_sp = factor(match_sp, levels = uq.match.sp)) %>% ggplot(aes(as.Date(week_sampling), fill = match_sp)) + geom_bar(width = 5) + facet_wrap(~sample_name+MTOF_diff_med_lab, ncol = 2, scales = "free_x") + ggtitle("x")+ scale_fill_manual(values = vec.man.fill) + geom_bar(data = filter(tmp.plot, is.na(match_sp)), fill = "grey95", col = "black", width = 5) + scale_y_continuous(expand = expansion(c(0,.1), 0))+ scale_x_date(date_breaks = "3 month", date_minor_breaks = "week", date_labels = "%b\n%y") + guides(fill=guide_legend(ncol=1)) + labs(y="Anzahl der Detektionen")+ theme_bw() + theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust=0.5, size = 7), axis.title.x = element_blank(), legend.title = element_blank(), legend.position = "right", legend.key.size = unit(0.4, 'cm'))+ facetted_pos_scales(x = list(sample_name == 'NMDW' ~ scale_x_date(limits = c(as.Date("2022-07-01"), as.Date("2023-03-01")))))
解决方案
问题根源
代码失效的核心原因有两点:一是facet_wrap使用了sample_name+MTOF_diff_med_lab双变量组合分面,但facetted_pos_scales的条件仅匹配单变量,未适配分面的完整逻辑;二是全局scale_x_date的参数会与分面专属刻度设置产生冲突,需明确参数的继承或覆盖规则。
修正后的代码
调整facetted_pos_scales的条件匹配逻辑,同时在分面专属scale_x_date中补充必要的日期格式参数(或继承全局设置):
mutate(match_sp = factor(match_sp, levels = uq.match.sp)) %>% ggplot(aes(as.Date(week_sampling), fill = match_sp)) + geom_bar(width = 5) + facet_wrap(~sample_name+MTOF_diff_med_lab, ncol = 2, scales = "free_x") + ggtitle("x")+ scale_fill_manual(values = vec.man.fill) + geom_bar(data = filter(tmp.plot, is.na(match_sp)), fill = "grey95", col = "black", width = 5) + scale_y_continuous(expand = expansion(c(0,.1), 0))+ # 保留全局日期轴基础设置 scale_x_date(date_breaks = "3 month", date_minor_breaks = "week", date_labels = "%b\n%y") + guides(fill=guide_legend(ncol=1)) + labs(y="Anzahl der Detektionen")+ theme_bw() + theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust=0.5, size = 7), axis.title.x = element_blank(), legend.title = element_blank(), legend.position = "right", legend.key.size = unit(0.4, 'cm'))+ # 修正分面刻度设置 facetted_pos_scales( x = list( # 匹配所有sample_name为NMDW的分面 sample_name == 'NMDW' ~ scale_x_date( limits = c(as.Date("2022-07-01"), as.Date("2023-03-01")), date_breaks = "3 month", date_labels = "%b\n%y" ) ) )
关键说明
- 分面条件匹配:当
facet_wrap使用多变量组合时,facetted_pos_scales可单独针对某一个分面变量设置条件(如sample_name == 'NMDW'),该规则会自动应用到所有符合该变量条件的分面。 - 参数继承:若希望分面日期轴继承全局的刻度、格式,可仅在分面
scale_x_date中指定需要修改的参数(如limits),无需重复声明其他参数。 scales = "free_x":必须保留该参数,否则分面的x轴无法独立调整刻度范围。
内容的提问来源于stack exchange,提问作者Philip Sander
相关产品推荐
相关产品推荐

