专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:
百度云盘链接: 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)
SampleID | PC1 | PC2 | PC3 | Group | PID |
---|---|---|---|---|---|
S_1 | 0.022770707 | -0.05555032 | -0.052194396 | A | P1 |
S_2 | 0.054692482 | -0.05059218 | 0.000958851 | A | P2 |
S_3 | 0.039981067 | -0.07099631 | 0.006141922 | A | P3 |
S_4 | 0.007793265 | -0.03775474 | 0.048682841 | A | P4 |
S_5 | 0.000007840 | -0.09190491 | -0.061645805 | A | P5 |
S_6 | -0.009869502 | -0.06707855 | -0.003102679 | A | P6 |
结果:示例数据
SampleID:样本标签
PC1-PC3:主成分
Group:分组标签
PID:参与者名称
数据预处理
因子化分组
plotdata <- dat |>
dplyr::mutate(Group = factor(Group, levels = group_names))
head(plotdata)
SampleID | PC1 | PC2 | PC3 | Group | PID |
---|---|---|---|---|---|
S_1 | 0.022770707 | -0.05555032 | -0.052194396 | A | P1 |
S_2 | 0.054692482 | -0.05059218 | 0.000958851 | A | P2 |
S_3 | 0.039981067 | -0.07099631 | 0.006141922 | A | P3 |
S_4 | 0.007793265 | -0.03775474 | 0.048682841 | A | P4 |
S_5 | 0.000007840 | -0.09190491 | -0.061645805 | A | P5 |
S_6 | -0.009869502 | -0.06707855 | -0.003102679 | A | P6 |
设置组间连线
分别计算图上的分组标签位置信息和分组的边界信息
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]))
}
画图
普通分组散点图,以下是代码解释:
ggplot(data = plotdata, aes(x = PC1, y = PC2))
:这是创建ggplot对象的基础函数调用。data
参数指定了要绘制的数据集,这里是plotdata
。aes
函数定义了x轴和y轴的变量,分别是PC1
和PC2
。geom_point(aes(color = Group, shape = Group), size = 3)
:这行代码添加了散点图的点。aes
函数在这里用于根据Group
变量来为点设置颜色和形状。size
参数设置了点的大小。geom_rug()
:添加了地毯图(rug plot),这是一种在x轴和y轴上显示数据点位置的细线。geom_hline(yintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6)
:添加了一条水平线,yintercept = 0
表示这条线在y轴上的位置,linetype = 2
设置了线的样式,linewidth
设置了线的宽度,alpha
设置了线的透明度。geom_vline(xintercept = 0, linetype = 2, linewidth = 0.5, alpha = 0.6)
:添加了一条垂直线,参数与水平线类似。labs(x = "PC1 (30%)", y = "PC2 (20%")
:设置了x轴和y轴的标签,同时在括号中提供了每个主成分的方差解释百分比。scale_color_manual(values = group_colors)
:手动设置颜色的比例尺,group_colors
应该是一个包含颜色值的向量。scale_shape_manual(values = group_shapes)
:手动设置形状的比例尺,group_shapes
应该是一个包含形状值的向量。guides(shape = "none")
:设置形状的图例不显示。theme_bw()
:应用了黑白主题,这是一种常见的图形主题。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
组间连线散点图,以下是代码解释
pl +
:继续使用pl
这个对象添加更多的图形元素。geom_line(aes(group = PID), linetype = 2, alpha = 0.2)
:这行代码添加了一组线段,用于表示不同组(由PID
变量指定)的数据轨迹。linetype = 2
设置了线的样式为虚线,alpha = 0.2
设置了线的透明度。geom_text(data = Compvar_position, aes(x = PC1, y = PC2, label = Group), show.legend = FALSE, size = 5)
:这行代码在图中添加了文本标签。data
参数指定了用于放置文本的数据框,aes
函数定义了文本的位置和标签内容。show.legend = FALSE
表示不显示图例,size = 5
设置了文本的大小。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
表示不显示图例。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上具有明显的分类效果。