news 2026/4/25 13:40:30

R语言实战:从iris数据集出发,搞定科研图表中的组间差异显著性分析(ggplot2 + ggpubr指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
R语言实战:从iris数据集出发,搞定科研图表中的组间差异显著性分析(ggplot2 + ggpubr指南)

R语言实战:用iris数据集玩转科研图表中的显著性分析

第一次接触科研图表时,我被那些密密麻麻的星号和P值搞得晕头转向。直到发现R语言中的ggplot2和ggpubr组合,才明白原来显著性分析可以如此优雅。iris数据集就像一位耐心的老师,用它来学习组间差异分析再合适不过了。

1. 数据准备与初步探索

在开始任何分析前,我们需要先了解数据的基本情况。iris数据集包含了三种鸢尾花(setosa、versicolor和virginica)的四个测量指标:萼片长度、萼片宽度、花瓣长度和花瓣宽度。

# 加载必要的包 library(ggplot2) library(ggpubr) library(dplyr) # 查看数据结构 head(iris) str(iris) summary(iris)

运行这些代码后,你会看到数据的前几行和结构概览。特别要注意的是Species列,这是我们后续分组分析的关键。

数据探索的四个关键点

  • 检查缺失值:sum(is.na(iris))
  • 查看各组样本量:table(iris$Species)
  • 计算各组描述统计量:iris %>% group_by(Species) %>% summarise_all(mean)
  • 绘制基础分布图:plot(iris$Sepal.Length ~ iris$Species)

2. 可视化基础:箱线图与散点图的组合艺术

科研图表的核心是清晰传达信息。箱线图展示分布特征,散点图显示个体数据点,二者结合是最佳实践。

# 基础箱线图 ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), alpha = 0.7) + theme_minimal()

这个简单的箱线图已经能展示不同物种间萼片长度的差异。但我们可以做得更好:

# 增强版箱线图+散点图 ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), outlier.shape = NA, width = 0.6) + geom_jitter(aes(color = Species), width = 0.1, alpha = 0.6) + scale_fill_brewer(palette = "Set2") + scale_color_brewer(palette = "Set2") + labs(title = "鸢尾花萼片长度比较", x = "物种", y = "萼片长度(cm)") + theme_bw(base_size = 12)

图表优化技巧

  • 使用outlier.shape = NA隐藏箱线图的异常值标记,因为我们已经用散点图展示所有数据点
  • 调整width参数控制箱线图和散点图的水平分布
  • 选择适合印刷的配色方案(如ColorBrewer的Set2)
  • 添加清晰的标题和轴标签

3. 统计检验方法的选择与实施

在添加显著性标记前,我们需要选择合适的统计检验方法。这取决于数据的分布特性和比较类型。

3.1 正态性与方差齐性检验

# Shapiro-Wilk正态性检验 by(iris$Sepal.Length, iris$Species, shapiro.test) # Bartlett方差齐性检验 bartlett.test(Sepal.Length ~ Species, data = iris)

如果数据符合正态分布且方差齐性,可以使用ANOVA;否则应考虑非参数检验如Kruskal-Wallis检验。

3.2 组间差异的整体检验

# Kruskal-Wallis检验(非参数方法) kruskal.test(Sepal.Length ~ Species, data = iris) # 如果数据满足参数检验条件,可以使用ANOVA summary(aov(Sepal.Length ~ Species, data = iris))

4. 在图表中添加显著性标记

ggpubr包的stat_compare_means函数让显著性标记变得简单。

4.1 整体比较标记

ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + geom_jitter(aes(color = Species), width = 0.1, alpha = 0.6) + stat_compare_means(method = "kruskal.test", label.y = 8.5, label.x = 1.5) + scale_fill_brewer(palette = "Set2") + scale_color_brewer(palette = "Set2") + theme_bw()

4.2 两两比较标记

更常见的是需要比较各组之间的差异:

# 定义比较组 my_comparisons <- list(c("setosa", "versicolor"), c("versicolor", "virginica"), c("setosa", "virginica")) # 添加两两比较结果 ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + geom_jitter(aes(color = Species), width = 0.1, alpha = 0.6) + stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", label = "p.signif") + stat_compare_means(method = "kruskal.test", label.y = 8.5) + scale_fill_brewer(palette = "Set2") + scale_color_brewer(palette = "Set2") + theme_bw()

stat_compare_means常用参数

参数说明常用取值
method统计检验方法"t.test", "wilcox.test", "anova", "kruskal.test"
label标签类型"p.signif"(星号), "p.format"(P值), "p.value"
comparisons两两比较列表list(c("group1","group2"),...)
label.y标签垂直位置数值,根据数据范围调整
hide.ns是否隐藏不显著结果TRUE/FALSE

5. 进阶技巧与常见问题解决

5.1 处理重叠的显著性标记

当比较组较多时,标记可能会重叠。解决方法:

# 使用step.increase参数增加标记间距 ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", label = "p.signif", step.increase = 0.1) # 增加10%的间距

5.2 调整显著性标记的显示方式

有时我们需要更详细的统计信息:

# 显示检验方法和P值 ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", label = "p.format", tip.length = 0.01) # 调整连接线长度

5.3 分面图表的显著性标记

当数据有多个分组变量时,分面是个好选择:

# 创建一个包含分组的新数据集 iris_group <- iris iris_group$Treatment <- rep(c("A","B"), each = 75)[1:150] # 分面图表 ggplot(iris_group, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + geom_jitter(aes(color = Species), width = 0.1, alpha = 0.6) + stat_compare_means(method = "kruskal.test", label = "p.format") + facet_wrap(~Treatment) + theme_bw()

5.4 保存高质量图表

最后,别忘了保存你的杰作:

p <- ggplot(iris, aes(x = Species, y = Sepal.Length)) + geom_boxplot(aes(fill = Species), width = 0.6) + geom_jitter(aes(color = Species), width = 0.1, alpha = 0.6) + stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", label = "p.signif") + scale_fill_brewer(palette = "Set2") + scale_color_brewer(palette = "Set2") + theme_bw() # 保存为PDF(适合论文投稿) ggsave("iris_comparison.pdf", p, width = 8, height = 6, dpi = 300) # 保存为PNG(适合PPT展示) ggsave("iris_comparison.png", p, width = 8, height = 6, dpi = 300)

在实际分析中,我发现调整图表细节往往比跑统计检验更耗时。一个实用的建议是:先快速生成基础图表验证分析思路,等确定方向后再花时间美化图表。ggplot2的图层系统让这种迭代过程变得非常高效。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 13:38:51

从PCI到PCIe:一次接口革命的幕后故事与技术细节对比

从PCI到PCIe&#xff1a;一次接口革命的幕后故事与技术细节对比 在计算机硬件发展的长河中&#xff0c;总线技术的演进往往伴随着计算架构的颠覆性变革。当工程师们面对那些基于传统PCI总线的遗留系统时&#xff0c;常常会困惑&#xff1a;为何现代设备几乎全部转向了PCIe接口…

作者头像 李华
网站建设 2026/4/25 13:38:50

MoveMouse深度优化:彻底消除烦人的左上角弹窗提示终极指南

MoveMouse深度优化&#xff1a;彻底消除烦人的左上角弹窗提示终极指南 【免费下载链接】movemouse Move Mouse is a simple piece of software that is designed to simulate user activity. 项目地址: https://gitcode.com/gh_mirrors/mo/movemouse MoveMouse是一款简单…

作者头像 李华
网站建设 2026/4/25 13:36:02

终极指南:如何用CZSC.dll插件在通达信中实现缠论自动化分析

终极指南&#xff1a;如何用CZSC.dll插件在通达信中实现缠论自动化分析 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 在金融量化分析领域&#xff0c;缠论自动化分析已成为技术交易者的核心需求。CZSC…

作者头像 李华