科研绘图系列:R语言分组散点图(grouped scatter plot)

文摘   2024-07-15 10:56   贵州  

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

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

介绍

分组连线散点图是一种高效的数据可视化手段,它通过在散点图上添加线条来明确展示数据点的分组情况。这种图形能够显著地突出不同组之间的差异,为读者提供了一种直观且易于理解的方式来识别数据的聚类结构。相较于传统的散点图,分组连线散点图在展示数据分组信息方面更为清晰和有效。

在学术出版领域,分组连线散点图因其能够提供丰富的视觉信息和增强数据解释力而备受青睐。它不仅有助于提升文章的专业形象,还能够体现作者在数据分析方面的深入探究。

加载R包

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

library(tidyverse)
library(plotly)
library(patchwork)

rm(list = ls())
options(stringsAsFactors = F)

# group & color
group_names <- c("A", "B", "C")
group_colors <- c("#0073C2FF", "#EFC000FF", "#CD534CFF")
group_shapes <- c(15, 16, 17)

导入数据

该数据来自主成分分析的结果

dat <- data.frame(
SampleID = paste0("S_", 1:24),
PC1 = c(0.022770707, 0.054692482, 0.039981067, 0.007793265, 7.84e-06, -0.009869502, -0.059123147,
-0.100341862, 0.027247694, 0.156717826, 0.247041497, 0.181258984, 0.172786176,
0.131875865, 0.230052533, 0.163389878, -0.116222295, -0.221050628, -0.084606354,
-0.214705258, -0.210235971, -0.200839043, -0.06763774, -0.175523677),
PC2 = c(-0.05555032, -0.050592178, -0.070996307, -0.037754744, -0.091904909, -0.067078552,
-0.114239498, -0.099288661, 0.024239885, 0.06885023, 0.005302438, 0.035700696, 0.042451004,
0.019859585, 0.019250596, 0.031094568, 0.022300445, 0.057798633, 0.08757355, 0.048752276,
0.021344081, 0.055314429, -0.005297042, 0.10518067),
PC3 = c(-0.052194396, 0.000958851, 0.006141922, 0.048682841, -0.061645805, -0.003102679, 0.028396414,
0.01980974, -0.055276428, -0.082034627, 0.081183975, 0.030190352, -0.035916706, -0.052318759,
0.016482896, 0.096296503, -0.01270539, 0.019406331, 0.033471156, 0.003175988, 0.020986428,
0.025259074, -0.093440324, 0.062841498),
Group = c(rep("A", 8), rep("B", 8), rep("C", 8)),
PID = paste0("P", rep(1:8, 3)))

head(dat)
SampleIDPC1PC2PC3GroupPID
S_10.022770707-0.05555032-0.052194396AP1
S_20.054692482-0.050592180.000958851AP2
S_30.039981067-0.070996310.006141922AP3
S_40.007793265-0.037754740.048682841AP4
S_50.000007840-0.09190491-0.061645805AP5
S_6-0.009869502-0.06707855-0.003102679AP6

结果:示例数据

  • SampleID:样本标签

  • PC1-PC3:主成分

  • Group:分组标签

  • PID:参与者名称

数据预处理

  • 因子化分组

plotdata <- dat |>
dplyr::mutate(Group = factor(Group, levels = group_names))

head(plotdata)
SampleIDPC1PC2PC3GroupPID
S_10.022770707-0.05555032-0.052194396AP1
S_20.054692482-0.050592180.000958851AP2
S_30.039981067-0.070996310.006141922AP3
S_40.007793265-0.037754740.048682841AP4
S_50.000007840-0.09190491-0.061645805AP5
S_6-0.009869502-0.06707855-0.003102679AP6

设置组间连线

分别计算图上的分组标签位置信息分组的边界信息

  • mean计算分组标签位置信息

  • chull函数计算边界位置信息

Compvar_position <- cbind(PC1 = tapply(plotdata$PC1, plotdata$Group, mean), 
PC2 = tapply(plotdata$PC2, plotdata$Group, mean)) %>%
as.data.frame() %>%
tibble::rownames_to_column("Group")

border_fun <- function(x = plotdata, grp) {

tempdat <- x[x$Group %in% grp, , F]
res <- tempdat[chull(tempdat[[2]], tempdat[[3]]), ]

return(res)
}

Compvar_border <- NULL
for (i in 1:length(unique(plotdata$Group))) {
Compvar_border <- rbind(Compvar_border, border_fun(grp = unique(plotdata$Group)[i]))
}

画图

普通分组散点图,以下是代码解释:

  1. ggplot(data = plotdata, aes(x = PC1, y = PC2)):这是创建ggplot对象的基础函数调用。data参数指定了要绘制的数据集,这里是plotdataaes函数定义了x轴和y轴的变量,分别是PC1PC2

  2. geom_point(aes(color = Group, shape = Group), size = 3):这行代码添加了散点图的点。aes函数在这里用于根据Group变量来为点设置颜色和形状。size参数设置了点的大小。

  3. geom_rug():添加了地毯图(rug plot),这是一种在x轴和y轴上显示数据点位置的细线。

  4. geom_hline(yintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6):添加了一条水平线,yintercept = 0表示这条线在y轴上的位置,linetype = 2设置了线的样式,linewidth设置了线的宽度,alpha设置了线的透明度。

  5. geom_vline(xintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6):添加了一条垂直线,参数与水平线类似。

  6. labs(x = "PC1 (30%)", y = "PC2 (20%"):设置了x轴和y轴的标签,同时在括号中提供了每个主成分的方差解释百分比。

  7. scale_color_manual(values = group_colors):手动设置颜色的比例尺,group_colors应该是一个包含颜色值的向量。

  8. scale_shape_manual(values = group_shapes):手动设置形状的比例尺,group_shapes应该是一个包含形状值的向量。

  9. guides(shape = "none"):设置形状的图例不显示。

  10. theme_bw():应用了黑白主题,这是一种常见的图形主题。

  11. theme(...):自定义了图形的多个元素,包括标题、轴标题、轴文本、文本、条带文本、网格线、面板背景、图例键等。

pl <- ggplot(data = plotdata, aes(x = PC1, y = PC2)) + 
geom_point(aes(color = Group, shape = Group), size = 3) +
geom_rug() +
geom_hline(yintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6) +
geom_vline(xintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6) +
labs(x = "PC1 (30%)", y = "PC2 (20%)") +
scale_color_manual(values = group_colors) +
scale_shape_manual(values = group_shapes) +
guides(shape = "none") +
theme_bw() +
theme(plot.title = element_text(size = 10, color = "black", face = "bold", hjust = 0.5),
axis.title = element_text(size = 10, color = "black", face = "bold"),
axis.text = element_text(size = 9, color = "black"),
text = element_text(size = 8, color = "black"),
strip.text = element_text(size = 9, color = "black", face = "bold"),
panel.grid = element_blank(),
panel.background = element_rect(color = "black", fill = "transparent"),
legend.key = element_rect(fill = "transparent"))

pl

  • 组间连线散点图,以下是代码解释

  1. pl +:继续使用pl这个对象添加更多的图形元素。

  2. geom_line(aes(group = PID), linetype = 2, alpha = 0.2):这行代码添加了一组线段,用于表示不同组(由PID变量指定)的数据轨迹。linetype = 2设置了线的样式为虚线,alpha = 0.2设置了线的透明度。

  3. geom_text(data = Compvar_position, aes(x = PC1, y = PC2, label = Group), show.legend = FALSE, size = 5):这行代码在图中添加了文本标签。data参数指定了用于放置文本的数据框,aes函数定义了文本的位置和标签内容。show.legend = FALSE表示不显示图例,size = 5设置了文本的大小。

  4. geom_polygon(data = Compvar_border, aes(fill = Group), color = "black", alpha = 0.3, linetype = 2, show.legend = FALSE):这行代码添加了多边形填充区域,用于表示不同组的边界。data参数指定了用于绘制多边形的数据框,aes(fill = Group)根据Group变量为多边形设置填充颜色。color = "black"设置了多边形边界的颜色,alpha = 0.3设置了填充的透明度,linetype = 2设置了边界线的样式,show.legend = FALSE表示不显示图例。

  5. scale_color_manual(values = group_colors):这行代码手动设置颜色的比例尺,group_colors应该是一个预先定义好的包含颜色值的向量,用于为图中的元素(如点、线、多边形等)指定颜色。

pl2 <- pl + geom_line(aes(group = PID), linetype = 2, alpha = 0.2) + 
geom_text(data = Compvar_position, aes(x = PC1, y = PC2, label = Group), show.legend = FALSE, size = 5) +
geom_polygon(data = Compvar_border, aes(fill = Group), color = "black", alpha = 0.3, linetype = 2, show.legend = FALSE) +
scale_color_manual(values = group_colors)

pl2

结果:图中展示A、B和C三组数据在PC1和PC2上具有明显的分类效果。


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