在生态学研究中最常见的需求之一,就是比较不同组别间的差异显著性。比如我们可能想知道:
箱线图(Boxplot)之所以成为生态学家的首选工具,主要因为它的三大优势:
在R语言生态学分析中,我们通常采用ggplot2+ggpubr的组合方案:
ggplot2负责数据可视化基础框架ggpubr提供便捷的统计检验功能这种组合既保持了专业绘图的灵活性,又简化了统计检验的流程,特别适合处理生态学研究中常见的多组比较问题。
在开始分析前,我们需要确保相关R包就位。推荐使用以下方式安装:
r复制# 安装CRAN上的稳定版本
install.packages(c("ggplot2", "ggpubr"))
# 或者从GitHub获取开发版(功能可能更新)
# devtools::install_github("kassambara/ggpubr")
加载包时有个专业技巧:使用suppressPackageStartupMessages()可以避免冗长的启动信息干扰输出:
r复制suppressPackageStartupMessages({
library(ggplot2)
library(ggpubr)
})
生态数据通常以CSV格式存储,读取时需要注意几个关键参数:
r复制# 最佳实践读取方式
data <- read.csv("data.csv",
header = TRUE,
stringsAsFactors = TRUE, # 字符向量自动转为因子
na.strings = c("NA", "", "NaN")) # 定义缺失值表示
# 立即检查数据结构
str(data)
head(data, 3)
特别提醒:
一个典型的生态数据结构应该类似这样:
| 物种 | LDMC | SLA | 生活型 |
|---|---|---|---|
| 黄丹木姜子 | 0.45 | 12.3 | 乔木 |
| 猫儿刺 | 0.38 | 15.6 | 灌木 |
| 短柱柃 | 0.42 | 14.1 | 灌木 |
注意:如果数据中存在极端异常值,建议先用
boxplot.stats()函数检测并确认是否为真实数据,避免绘图时产生误导。
让我们从最基础的箱线图开始,使用ggplot2的核心语法:
r复制base_plot <- ggplot(data, aes(x = sp, y = LDMC, fill = sp)) +
geom_boxplot(
width = 0.6, # 箱体宽度
alpha = 0.8, # 透明度
outlier.shape = 21, # 离群点形状
outlier.size = 2 # 离群点大小
)
print(base_plot)
关键参数解析:
width:控制箱体的宽度,0.5-0.7通常视觉效果最佳alpha:透明度设置,当有多组重叠时特别有用outlier.shape:建议使用21(带填充的圆点),便于区分进行多组两两比较时,需要精心设计comparisons列表。生态学研究中常见的分组策略包括:
r复制# 专业化的比较组设置方式
comparisons <- list(
c("黄丹木姜子", "猫儿刺"),
c("猫儿刺", "短柱柃"),
c("黄丹木姜子", "短柱柃")
)
# 更智能的自动生成所有两两组合(当组别多时特别有用)
species_list <- levels(data$sp)
comparisons_auto <- combn(species_list, 2, simplify = FALSE)
ggpubr的stat_compare_means()提供了多种统计方法选择:
r复制box_plot <- base_plot +
stat_compare_means(
comparisons = comparisons,
method = "t.test", # 也常用wilcox.test用于非参数检验
label = "p.signif", # 显示*号而非具体p值
hide.ns = TRUE, # 隐藏不显著的结果
tip.length = 0.01, # 调整显著性线头长度
step.increase = 0.1, # 多组比较时的y轴间隔
size = 4 # 标注字号
)
专业建议:当样本量较小(<30)或数据不符合正态分布时,应将method改为"wilcox.test"(Mann-Whitney U检验)
生态学图表推荐使用自然色系,这里提供几种专业配色方案:
r复制# 经典生态配色
eco_colors <- c(
"#3B7A57", # 森林绿
"#6F4E37", # 咖啡棕
"#C4A484" # 沙色
)
# 色盲友好配色
cb_colors <- c(
"#E69F00", # 橙色
"#56B4E9", # 天蓝
"#009E73" # 蓝绿
)
box_plot + scale_fill_manual(values = eco_colors)
专业期刊级别的主题设置应该包括这些元素:
r复制final_plot <- box_plot +
theme(
text = element_text(family = "Arial", size = 12, colour = "black"),
panel.background = element_rect(fill = "white"),
panel.grid.major = element_line(color = "grey90", linewidth = 0.2),
panel.grid.minor = element_blank(),
axis.line = element_line(color = "black", linewidth = 0.5),
axis.ticks = element_line(color = "black", linewidth = 0.5),
legend.position = "right",
legend.background = element_blank(),
plot.margin = unit(c(1,1,1,1), "cm")
) +
labs(
x = "植物物种",
y = "叶片干物质含量(g/g)",
title = "不同物种叶片干物质含量比较",
caption = "误差线表示95%置信区间\n* p<0.05, ** p<0.01, *** p<0.001"
)
当需要比较多个指标时,可以使用patchwork包进行专业排版:
r复制library(patchwork)
p1 <- ggplot(data, aes(sp, LDMC)) + geom_boxplot() + labs(title = "LDMC")
p2 <- ggplot(data, aes(sp, SLA)) + geom_boxplot() + labs(title = "SLA")
# 专业级排版
(p1 + p2) +
plot_annotation(
title = "植物功能性状种间差异",
tag_levels = "A",
theme = theme(plot.title = element_text(size = 14, face = "bold"))
) &
theme_classic(base_size = 11)
生态数据常遇到的检验选择问题:
| 数据类型 | 组别数量 | 推荐检验方法 | R函数参数 |
|---|---|---|---|
| 正态分布 | 2组 | 学生t检验 | method="t.test" |
| 非正态 | 2组 | Mann-Whitney U检验 | method="wilcox.test" |
| 正态+方差齐性 | ≥3组 | 单因素ANOVA | method="anova" |
| 非正态 | ≥3组 | Kruskal-Wallis检验 | method="kruskal" |
确保发表级图片质量的保存方式:
r复制ggsave("boxplot_publication.tiff",
plot = final_plot,
device = "tiff",
dpi = 600,
width = 15,
height = 10,
units = "cm",
compression = "lzw")
关键参数说明:
r复制ggplot(data, aes(sp, LDMC)) +
geom_boxplot() +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10", scales::math_format(10^.x))
)
r复制ggplot(data, aes(sp, LDMC)) +
geom_boxplot(width = 0.6, outlier.shape = NA) +
geom_jitter(
width = 0.1,
height = 0,
alpha = 0.4,
size = 2,
aes(color = sp)
) +
guides(color = "none")
r复制ggplot(data, aes(interaction(sp, life_form), LDMC)) +
geom_boxplot(aes(fill = life_form)) +
scale_x_discrete(labels = function(x) gsub("\\.", "\n", x))
在生态数据分析实践中,我发现有几个关键点需要特别注意:
最后分享一个我常用的快捷函数,可以一次性生成带统计检验的箱线图:
r复制quick_boxplot <- function(data, x, y,
method = "wilcox.test",
palette = "Set2") {
ggplot(data, aes_string(x = x, y = y, fill = x)) +
geom_boxplot(alpha = 0.8) +
stat_compare_means(
method = method,
label = "p.signif",
comparisons = combn(levels(data[[x]]), 2, simplify = FALSE)
) +
scale_fill_brewer(palette = palette) +
theme_minimal()
}