You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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"
      )
    )
  )

关键说明

  1. 分面条件匹配:当facet_wrap使用多变量组合时,facetted_pos_scales可单独针对某一个分面变量设置条件(如sample_name == 'NMDW'),该规则会自动应用到所有符合该变量条件的分面。
  2. 参数继承:若希望分面日期轴继承全局的刻度、格式,可仅在分面scale_x_date中指定需要修改的参数(如limits),无需重复声明其他参数。
  3. scales = "free_x":必须保留该参数,否则分面的x轴无法独立调整刻度范围。

内容的提问来源于stack exchange,提问作者Philip Sander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:52:35