使用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
相关产品推荐
相关产品推荐

