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

使用ggplot2的facet_wrap绘制箱线图的4项技术问题

解决ggplot2 facet_wrap箱线图的四个问题

问题1:三角形符号(Δ)无法在图形中呈现

直接输入的Δ符号可能因字体兼容性问题无法显示,推荐用expression()生成兼容的数学符号:

df$strains <- factor(df$strains, 
                     levels = c("wt","dfg1Δ","asd1Δ","dfg1Δ asd1Δ"),
                     labels = c("wt", expression(dfg1*Delta), expression(asd1*Delta), expression(dfg1*Delta~asd1*Delta)),
                     ordered = TRUE)

也可在theme中指定支持Unicode的字体(如"Arial Unicode MS")作为替代方案。

问题2:仅保留底部面板的x轴标签

利用after_stat(panel)判断面板位置,仅给最后一个面板显示x轴标签和刻度:

theme(
  axis.text.x = element_text(color = ifelse(after_stat(panel) == length(unique(df$strains)), "black", "transparent")),
  axis.ticks.x = element_line(color = ifelse(after_stat(panel) == length(unique(df$strains)), "black", "transparent"))
)

问题3:为每个facet面板单独添加显著性标注

使用geom_signif的facet.by参数绑定分面变量,同时修正原代码中"omM"的笔误为"0mM":

geom_signif(
  comparisons = rep(list(c("0mM","4mM")), 4),
  map_signif_level = TRUE,
  annotations = c("*","**","**","*"),
  y = c(16,17,12,13),
  facet.by = "strains",
  inherit.aes = FALSE
)

问题4:扩大y轴范围预留空白

通过scale_y_continuous的expand参数增加顶部空白,避免显著性标注贴紧边框:

scale_y_continuous(expand = expansion(mult = c(0, 0.15)))

完整修正代码

strains <- rep(c("wt","dfg1Δ","asd1Δ","dfg1Δ asd1Δ"),each=6)
x <- rep(c("0mM","4mM"),each=3)
y <- c(12,12.91,12.5,15,15.1,14,12,12.2,12.3,15.,15.3,15.9,7.1,7.7,7.3,11.5,11.6,11.1,7.5,7.4,7.3,12,11,10)
df <- data.frame(x,y,strains)

# 修正Δ符号显示
df$strains <- factor(df$strains, 
                     levels = c("wt","dfg1Δ","asd1Δ","dfg1Δ asd1Δ"),
                     labels = c("wt", expression(dfg1*Delta), expression(asd1*Delta), expression(dfg1*Delta~asd1*Delta)),
                     ordered = TRUE)

ggplot(df)+
  aes(x=x,y=y,fill=x)+
  geom_boxplot()+
  geom_point()+
  # 分面单独设置显著性标注
  geom_signif(
    comparisons = rep(list(c("0mM","4mM")), 4),
    map_signif_level = TRUE,
    annotations = c("*","**","**","*"),
    y = c(16,17,12,13),
    facet.by = "strains",
    inherit.aes = FALSE
  )+
  facet_wrap(~strains,scales = "free",ncol = 1)+
  xlab("")+
  ylab(expression(mu~"m"))+ # 修正原ylab语法错误
  scale_fill_manual(values = c("0mM"="gray","4mM"="pink"))+
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))+ # 扩大y轴顶部空白
  theme_linedraw(base_size = 16)+
  theme(
    axis.line = element_blank(),
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "none",
    strip.background = element_rect(fill = "black"),
    strip.text = element_text(color = "white"), # 黑背景下显示白色标题文字
    # 仅底部面板显示x轴标签
    axis.text.x = element_text(color = ifelse(after_stat(panel) == length(unique(df$strains)), "black", "transparent")),
    axis.ticks.x = element_line(color = ifelse(after_stat(panel) == length(unique(df$strains)), "black", "transparent"))
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:43:16