R语言箱线图绘制,看这一篇就够了(附完整代码)
在差异比较分析中柱状图加误差线是最常见的可视化方式但其信息量有限——仅呈现均值与标准差无法反映数据分布的全貌。而箱线图boxplot通过五个统计量最小值、下四分位数、中位数、上四分位数、最大值可以同时判断数据是否偏斜、各组离散度差异、是否存在离群值以及组间中位数的差异程度。这一可视化方法在生态学、环境科学等领域的期刊中几乎是标配。本文以植物多样性数据为例从基础箱线图出发逐步叠加美化与统计标注最终达到期刊发表标准。一、认识你的数据演示数据为模拟的生态学多样性调查数据共 7 个样地分别在春、夏、秋季对林地、草地、农田进行植物调查。各字段含义如下字段说明示例值Plot样地编号For-Sp01Season采样季节Spring, Summer, AutumnHabitat生境类型Forest, Grassland, FarmlandShannonShannon 多样性指数2.5–3.6SimpsonSimpson 优势度指数0.7–0.96读取数据并设置因子顺序df-read.csv(ecology_diversity_data.csv,headerTRUE)df$Season-factor(df$Season,levelsc(Spring,Summer,Autumn))df$Habitat-factor(df$Habitat,levelsc(Forest,Grassland,Farmland))二、基础箱线图R 中ggplot2包提供了绘制箱线图的核心函数geom_boxplot()可自动计算每组的中位数、四分位数及触须范围。library(ggplot2)ggplot(df,aes(xSeason,yShannon))geom_boxplot()默认参数下输出为灰色填充、黑色边框的箱线图。在此基础上可以逐步叠加美化参数p_base-ggplot(df,aes(xSeason,yShannon))geom_boxplot()labs(xSeason,yShannon index)p_base三、美化配色与 jitter 散点配色方案本文采用以下配色组合Season颜色色号Spring蓝绿色#00AFBBSummer金黄色#E7B800Autumn橙红色#FC4E07jitter 散点叠加在箱线图上叠加 jitter 散点可展示每个观测值的实际位置避免箱线图掩盖数据内部的分布细节。使用ggpubr::ggboxplot让代码更简洁library(ggpubr)p_beauty-ggboxplot(df,xSeason,yShannon,colorSeason,palettec(#00AFBB,#E7B800,#FC4E07),xlabSeason,ylabShannon index,addjitter,add.paramslist(size1))p_beauty四、添加统计检验4.1 检验方法选择多组均值比较的标准方法为 ANOVA Tukey HSD但该检验要求数据满足正态分布与方差齐性。生态学数据特别是物种丰富度等计数数据常不满足上述假设。非参数的 Kruskal-Wallis 检验不依赖分布假设仅比较秩次适用于更广泛的数据类型。若 Kruskal-Wallis 检验显著进一步采用两两 t 检验判断具体组间差异。# 全局检验compare_means(Shannon~Season,datadf,methodkruskal.test)4.2 图形化标注ggpubr::stat_compare_means()可在图形上直接标注 p 值。将绘图逻辑封装为函数以便后续复用# 定义两两比较组groups_season-list(c(Spring,Summer),c(Spring,Autumn),c(Summer,Autumn))plot_single_factor-function(yvar,ylabname){ggboxplot(df,xSeason,yyvar,colorSeason,palettec(#00AFBB,#E7B800,#FC4E07),xlabSeason,ylabylabname,addjitter,add.paramslist(size1))stat_compare_means(comparisonsgroups_season,methodt.test,labelp.format,hide.nsTRUE)theme_clean}参数说明hide.ns TRUE仅标注显著的比较结果FALSE则在非显著比较处标注 “ns”label p.format显示精确 p 值改为p.signif则显示为星号*、**、***向内刻度线是发表级图表常用的细节处理theme_clean-theme(legend.positionnone,axis.ticks.lengthunit(-0.1,cm),# 向内延伸负号向内axis.text.xelement_text(marginmargin(t4)),axis.text.yelement_text(marginmargin(l4)))注意axis.ticks.length unit(-0.1, cm)使刻度线向内该设置在 ecology 类期刊中较为普遍。调用函数生成带统计标注的单因素箱线图p3_stat-plot_single_factor(Shannon,Shannon index)p3_stat五、双因素箱线图季节 × 生境在单因素分析基础上进一步考察生境类型是否影响多样性的季节变化模式。5.1 组合变量双因素图需同时展示 Season 与 Habitat 两个分组变量。将二者拼接为组合变量Season_Habitat可使 x 轴直接容纳 9 个分组3 季节 × 3 生境df$Season_Habitat-factor(paste(df$Season,df$Habitat,sep_),levelsc(Spring_Forest,Spring_Grassland,Spring_Farmland,Summer_Forest,Summer_Grassland,Summer_Farmland,Autumn_Forest,Autumn_Grassland,Autumn_Farmland))5.2 配色规则每种生境类型分配固定颜色跨季节保持一致habitat_colors-c(#1B9E77,#D95F02,#7570B3)# 在 ggboxplot 中重复 3 次以覆盖各季节paletterep(habitat_colors,3)5.3 显著性字母标注9 个分组若使用方括号加线条标注两两比较结果图形将过于拥挤。替代方案为显著性字母标注法compact letter display。共享同一字母的组间差异不显著无共同字母的组间差异显著。实现分三步pairwise_t_test计算所有 36 组两两比较的 p 值multcompLetters将 p 值矩阵转换为字母分组geom_text将字母标注于箱体上方library(export)library(rstatix)library(multcompView)generate_letters-function(varname){pw-df%%pairwise_t_test(as.formula(paste(varname,~ Season_Habitat)),p.adjust.methodnone)pvals-pw$p names(pvals)-paste(pw$group1,pw$group2,sep-)letters-multcompView::multcompLetters(pvals)temp-data.frame(Season_Habitatnames(letters$Letters),labelletters$Letters,stringsAsFactorsFALSE)temp$Season_Habitat-factor(temp$Season_Habitat,levelslevels(df$Season_Habitat))return(temp)}plot_two_factor-function(varname,ylabname){letters_df-generate_letters(varname)ggboxplot(df,xSeason_Habitat,yvarname,colorSeason_Habitat,paletterep(habitat_colors,3),xlab,ylabylabname,addjitter,add.paramslist(size1))geom_text(dataletters_df,aes(xSeason_Habitat,ymax(df[[varname]])*1.05,labellabel),vjust0)theme_cleantheme(axis.text.xelement_text(angle45,hjust1))}其中angle 45旋转 x 轴标签以避免文字重叠max(df[[varname]]) * 1.05计算字母标注位置。调用函数生成双因素箱线图q1-plot_two_factor(Shannon,Shannon index)q1六、双因素图结果解读显著性字母的判读原则两组之间若存在至少一个相同字母则差异不显著若完全无共同字母则差异显著。从模拟数据趋势来看Forest在各季节中多样性指数最高且季节间波动幅度较小字母分组跨季节变化有限Grassland多样性居中秋季下降趋势较明显Farmland多样性最低且季节间波动幅度最大可能表明受人为干扰较强的生境对季节性气候变化的缓冲能力较弱单因素图与双因素图回答不同层次的问题单因素图判断季节间是否存在显著差异双因素图进一步判断季节差异的模式是否因生境类型而异。二者互补而非重复。七、多指标拼图与多格式导出将 Shannon 与 Simpson 两个指标的箱线图拼接为综合 Figure便于期刊排版与读者对比。7.1 单因素拼图library(cowplot)p1-plot_single_factor(Shannon,Shannon index)p2-plot_single_factor(Simpson,Simpson index)p_final-plot_grid(p1,p2,ncol2)tiff(boxplot_publication.tif,width3100,height1600,pointsize8,res280,compressionlzw)print(p_final);dev.off()png(boxplot_publication.png,width3100,height1600,res280)print(p_final);dev.off()graph2ppt(p_final,fileboxplot_publication.pptx)7.2 双因素拼图q1-plot_two_factor(Shannon,Shannon index)q2-plot_two_factor(Simpson,Simpson index)q_final-plot_grid(q1,q2,ncol2)tiff(boxplot_two_way_comb_publication.tif,width3400,height1600,pointsize8,res280,compressionlzw)print(q_final);dev.off()png(boxplot_two_way_comb_publication.png,width3400,height1600,res280)print(q_final);dev.off()graph2ppt(q_final,fileboxplot_two_way_comb_publication.pptx)其中export::graph2ppt()的PPT格式图保留全部矢量信息导出后可在PPT中直接编辑标签、颜色与大小非常推荐。八、完整代码以下为本文全部代码复制后修改read.csv()中的文件名为你的数据并修改后面的变量/分组等即可运行。# 加载包 library(ggplot2)library(ggpubr)library(rstatix)library(multcompView)library(cowplot)library(export)library(dplyr)# 全局设置 df-read.csv(ecology_diversity_data.csv,headerTRUE)df$Season-factor(df$Season,levelsc(Spring,Summer,Autumn))df$Habitat-factor(df$Habitat,levelsc(Forest,Grassland,Farmland))season_colors-c(#00AFBB,#E7B800,#FC4E07)habitat_colors-c(#1B9E77,#D95F02,#7570B3)theme_clean-theme(legend.positionnone,axis.ticks.lengthunit(-0.1,cm),axis.text.xelement_text(marginmargin(t4)),axis.text.yelement_text(marginmargin(l4)))groups_season-list(c(Spring,Summer),c(Spring,Autumn),c(Summer,Autumn))# 单因素绘图函数 plot_single_factor-function(yvar,ylabname){ggboxplot(df,xSeason,yyvar,colorSeason,paletteseason_colors,xlabSeason,ylabylabname,addjitter,add.paramslist(size1))stat_compare_means(comparisonsgroups_season,methodt.test,labelp.format,hide.nsTRUE)theme_clean}# 双因素准备组合变量 df$Season_Habitat-factor(paste(df$Season,df$Habitat,sep_),levelsc(Spring_Forest,Spring_Grassland,Spring_Farmland,Summer_Forest,Summer_Grassland,Summer_Farmland,Autumn_Forest,Autumn_Grassland,Autumn_Farmland))# 双因素显著性字母函数 generate_letters-function(varname){pw-df%%pairwise_t_test(as.formula(paste(varname,~ Season_Habitat)),p.adjust.methodnone)pvals-pw$p names(pvals)-paste(pw$group1,pw$group2,sep-)letters-multcompView::multcompLetters(pvals)temp-data.frame(Season_Habitatnames(letters$Letters),labelletters$Letters,stringsAsFactorsFALSE)temp$Season_Habitat-factor(temp$Season_Habitat,levelslevels(df$Season_Habitat))return(temp)}# 双因素绘图函数 plot_two_factor-function(varname,ylabname){letters_df-generate_letters(varname)ggboxplot(df,xSeason_Habitat,yvarname,colorSeason_Habitat,paletterep(habitat_colors,3),xlab,ylabylabname,addjitter,add.paramslist(size1))geom_text(dataletters_df,aes(xSeason_Habitat,ymax(df[[varname]])*1.05,labellabel),vjust0)theme_cleantheme(axis.text.xelement_text(angle45,hjust1))}# 单因素Shannon Simpson 拼图 p1-plot_single_factor(Shannon,Shannon index)p2-plot_single_factor(Simpson,Simpson index)p_final-plot_grid(p1,p2,ncol2,labelsc((a),(b)),label_x0)tiff(boxplot_publication.tif,width3100,height1600,pointsize8,res280,compressionlzw)print(p_final);dev.off()png(boxplot_publication.png,width3100,height1600,res280)print(p_final);dev.off()graph2ppt(p_final,fileboxplot_publication.pptx)# 双因素Shannon Simpson 拼图 q1-plot_two_factor(Shannon,Shannon index)q2-plot_two_factor(Simpson,Simpson index)q_final-plot_grid(q1,q2,ncol2,labelsc((a),(b)),label_x0)tiff(boxplot_two_way_comb_publication.tif,width3400,height1600,pointsize8,res280,compressionlzw)print(q_final);dev.off()png(boxplot_two_way_comb_publication.png,width3400,height1600,res280)print(q_final);dev.off()graph2ppt(q_final,fileboxplot_two_way_comb_publication.pptx)九、适配自有数据将read.csv()中的文件名替换为你的数据文件并对应修改x、y、color/fill的变量映射即可单因素图替换分组变量与响应变量的列名双因素图同步修改组合变量的拼接方式及配色方案若需自定义配色ggsci包提供的pal_npg()、pal_aaas()及pal_lancet()等方案可直接调用。十、要点总结配色分离Season 与 Habitat 使用独立调色板避免变量混淆先全局检验后两两比较Kruskal-Wallis 判定整体差异t 检验定位具体组间差异双因素用字母标注分组较多时显著性字母优于方括号线条的可读性jitter 叠加展示数据分布细节数据量过大时可调整width参数矢量 PPT 导出graph2ppt()保留可编辑矢量信息便于美化微调如果对你有帮助欢迎点赞 、收藏 ⭐、转发 。