科研绘图系列:R语言两组数据散点分布图(scatter plot)

文摘   2024-07-06 16:32   中国香港  

专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:

百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码

介绍

展示两组数据的散点分布图是一种图形化表示方法,用于显示两个变量之间的关系。在散点图中,每个点代表一个数据点,其x坐标对应于第一组数据的值,y坐标对应于第二组数据的值。以下是散点图可以展示的一些结果:

  1. 线性关系:如果两组数据之间存在线性关系,散点图将显示出一种从左下角到右上角或从左上角到右下角的直线趋势。

  2. 非线性关系:如果存在非线性关系,散点图可能会显示出曲线或不规则的形状。

  3. 数据分布:散点图可以展示数据点的分布情况,包括集中趋势和分散程度。

  4. 异常值:散点图可以揭示异常值或离群点,这些点远离其他数据点,可能表明数据录入错误或特殊情况。

  5. 相关性强度:通过观察散点图,可以对变量间的相关性强度有一个直观的理解。紧密聚集的点表明强相关性,而分散的点表明弱相关性。

  6. 多变量关系:通过使用颜色、形状或大小等其他维度,散点图可以扩展到展示多个变量之间的关系。

  7. 趋势和模式:散点图可以揭示数据中的模式或趋势,比如季节性变化、周期性波动等。

  8. 数据分层:如果使用不同的颜色或形状来区分不同的子组,散点图可以展示不同子组间的关系和差异。

加载R包

knitr::opts_chunk$set(message = FALSE, warning = FALSE)

library(tidyverse)
library(scales)

# rm(list = ls())
options(stringsAsFactors = F)
options(future.globals.maxSize = 10000 * 1024^2)

导入数据

百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码

plotdata <- read.csv('./inputdata/34-rCDI-scatter.csv')

head(plotdata)

SampleNametaxonomic_levelsfmpdifference
1FMT1ALM_FMT1.pairgenus445814
2FMT1ALM_FMT1.pairspecies8812739
3FMT10ALM_FMT10.pairgenus355116
4FMT10ALM_FMT10.pairspecies619332
5FMT100ALM_FMT100.pairgenus315524
6FMT100ALM_FMT100.pairspecies4710861

处理数据

设置画图所需要的参数

yy.s <- 80
yy.g <- 30
nudge <- 70

stats.s.diff_format <- "µ=49.1±19.9"
stats.g.diff_format <- "µ=26.8±9"

stats.s.diff_mean <- 49.13846
stats.g.diff_mean <- 26.75385

画图

比较两组指标SameStr / MetaPhlAn2Strain Finder / mg-OTUs在不同水平的分布情况,以下是代码的解释:

  1. ggplot(data = plotdata, aes(y = mp, x = sf, fill = taxonomic_level)):开始创建一个ggplot对象,指定数据源为plotdata数据框,并将y轴映射到mp变量,x轴映射到sf变量,填充颜色映射到taxonomic_level变量。

  2. geom_point(shape = 21, col = 'black', size = 5):添加点图层,设置点的形状为实心(21代表实心圆),颜色为黑色,大小为5。

  3. annotate(geom = 'text', y = yy.s, x = yy.s + nudge + 5, label = paste("species:", stats.s.diff_format), size = 5, parse = F):在图中添加文本注释,指定文本位置和内容,yy.s为文本的y坐标,nudge是一个偏移量,stats.s.diff_format是文本内容的一部分。

  4. 类似地,annotate函数的第二次调用添加了另一个文本注释,针对属(genus)级别的数据。

  5. annotate("segment", ...):添加线段图层,使用箭头标注物种和属级别的差异,yy.syy.g分别是物种和属级别的y坐标,stats.s.diff_meanstats.g.diff_mean分别是物种和属级别的差异均值。

  6. geom_abline(slope = 1, intercept = 0, linetype = 'dashed'):添加一条斜率为1,截距为0的虚线,表示完美的线性关系。

  7. labs(y = 'SameStr / MetaPhlAn2', x = 'Strain Finder / mg-OTUs', subtitle = 'Detected Taxa per Sample'):设置图例的标签,y轴标签为'SameStr / MetaPhlAn2',x轴标签为'Strain Finder / mg-OTUs',副标题为'Detected Taxa per Sample'。

  8. theme_cowplot():应用cowplot主题,cowplot是一个R包,提供了一些额外的图形主题和注释功能。

  9. scale_x_continuous(limits = c(0, 200))scale_y_continuous(limits = c(0, 200)):设置x轴和y轴的范围限制在0到200。

  10. scale_fill_manual(values = c('grey25', 'white'))scale_color_manual(values = c('black', 'black')):手动设置填充颜色和颜色的值,这里设置了两种颜色,灰色和白色用于填充,黑色用于点的颜色。

  11. theme(aspect.ratio = 1, ...):设置图形的一些主题属性,如长宽比为1,副标题的水平对齐方式,图例标题和位置。

pl <-  ggplot(data = plotdata, aes(y = mp, x = sf, fill = taxonomic_level)) +
geom_point(shape = 21, col = 'black', size = 5) +
annotate(geom = 'text', y = yy.s, x = yy.s + nudge + 5,
label = paste("species:", stats.s.diff_format), size = 5, parse = F) +
annotate(geom = 'text', y = yy.g, x = yy.g + nudge,
label = paste("genus:", stats.g.diff_format), size = 5, parse = F) +
annotate("segment", arrow = arrow(length = unit(0.3, "cm"), type = "closed"),
size = 1, col = 'black',
y = yy.s, yend = yy.s + stats.s.diff_mean,
x = yy.s, xend = yy.s) +
annotate("segment", arrow = arrow(length = unit(0.3, "cm"), type = "closed"),
size = 1, col = 'black',
y = yy.g, yend = yy.g + stats.g.diff_mean,
x = yy.g, xend = yy.g) +
geom_abline(slope = 1, intercept = 0, linetype = 'dashed') +
labs(y = 'SameStr / MetaPhlAn2', x = 'Strain Finder / mg-OTUs',
subtitle = 'Detected Taxa per Sample') +
theme_cowplot() +
scale_x_continuous(limits = c(0, 200)) +
scale_y_continuous(limits = c(0, 200)) +
scale_fill_manual(values = c('grey25', 'white')) +
scale_color_manual(values = c('black', 'black')) +
theme(aspect.ratio = 1,
plot.subtitle = element_text(hjust = 0.5),
legend.title = element_blank(),
legend.position = c(0.02, 0.9))
pl

结果:两组指标SameStr / MetaPhlAn2Strain Finder / mg-OTUs在genus和species的分布情况,可以看到species水平上,SameStr / MetaPhlAn2能检测出更多的species,这说明该种方法要更有优势。

  • 检测到物种水平看,SameStr / MetaPhlAn2要优于Strain Finder / mg-OTUs

如果大家有任何问题,欢迎留言沟通交流

生信学习者
生信教程分享,专注数据分析和科研绘图方向欢迎大家关注,也可一起探讨生信问题