昨天的稿子《NC杂志同款桑基图:连接富集结果中的通路与基因》中,将桑基图写成了桑葚图,我当时还纳闷呢,桑葚图?这个图长得也不像桑葚啊!后来网友留言告诉我人家叫桑基图,我说是没错啊。嗯对比了一下两个字,谁懂600°眼睛的痛!!!(ps:我平时不带眼镜,包括敲代码的时候,因为还有一只眼睛视力1.0,最近干眼症的症状越来越严重了,不知道有没有万能的网友有啥办法缓解啊!)。
那为什么桑基图要叫桑基图呢?来看看~
ggalluvial 介绍
ggalluvial 是ggplot2的一个扩展包,用来生成“alluvial plots”, 翻译成中文是 “冲积图” 或 “桑基图(Sankey diagram)”
冲积图(Alluvial Plot):这个名字来源于地理学中的“冲积”现象,指的是河流携带的泥沙在河口或低洼地区沉积形成的地貌。在数据可视化中,冲积图用来展示数据在不同类别之间的流动和变化,类似于河流的分支和汇合。
桑基图(Sankey Diagram):这是一种特殊的流图,用于展示数据在不同节点之间的流动和变化。它以德国工程师桑基(Matthew Henry Phineas Riall Sankey)的名字命名,他在1898年首次使用这种图来展示蒸汽机的热效率。桑基图的特点是流的宽度与数据量成正比,能够直观地展示数据的流动方向和大小。
五个基本构成
AIXS:一个维度(变量),数据在固定的水平位置上沿此维度垂直分组。
ALLUVIUM冲积带:水平(x轴)样条曲线,称为冲积带(alluvia),贯穿整个图表的宽度。
STRATUM层状结构:每个轴上的分组被描绘成不透明的块,称为地层(strata)。
LODE:水平方向(x轴方向)的样条曲线,被称为冲积层(alluvia),横跨整个图形的宽度。
FLOW:冲积层(alluvia)在相邻轴对之间的各段是流动(flows)。
数据格式
有两种:Alluvial (Wide) Format 和 Lodes (Long) Format
Alluvial (Wide) Format
数据集“UCBAdmissions”是1973年伯克利大学六个最大系研究生申请人的汇总数据,按录取情况和性别分类。 它是一个三维数组,由对4526个观测值在3个变量上的交叉汇总而成。
data <- as.data.frame(UCBAdmissions)
head(data)
#
# Admit Gender Dept Freq
# 1 Admitted Male A 512
# 2 Rejected Male A 313
# 3 Admitted Female A 89
# 4 Rejected Female A 19
# 5 Admitted Male B 353
# 6 Rejected Male B 207
library(ggalluvial)
gg <- ggplot(data, aes(y = Freq, axis1 = Gender, axis2 = Dept, axis3 = Admit)) +
geom_alluvium() +
geom_stratum() +
geom_text(stat = "stratum", aes(label = paste(after_stat(stratum)))) +
ggtitle("UC Berkeley admissions and rejections")
gg
Basic Lodes (Long) Format
可以由上面的数据格式转换为长数据格式:Lodes format,使用 to_lodes_form() 函数。
长格式需要一个额外的索引列,用于链接属于同一队列的行。这些数据跟踪了10名学生在8个学期的主要课程。缺失值表示尚未宣布专业。一个包含80行和3个变量的数据框:
-
student:学生标识符 -
semester:学期 -
curriculum:已宣布的专业课程
data(majors)
majors$curriculum <- as.factor(majors$curriculum)
head(majors)
table(majors$semester)
table(majors$curriculum)
table(majors$student)
# lode.guidance 参数控制流动路径的绘制方式。在这里,"frontback" 表示流动路径会从前面(front)到后面(back)绘制
gg <- ggplot(majors,aes(x = semester, stratum = curriculum, alluvium = student,fill = curriculum, label = curriculum)) +
geom_flow(stat = "alluvium", lode.guidance = "frontback",color = "darkgray") +
geom_stratum() +
ggtitle("student curricula across several semesters")
gg
这张图清晰地展示了若干学期中一组学生的学业课程安排,学生在不同学期选修课程的变化。
采用流格式(lode format)使我们能够对相邻轴之间的流动进行汇总,当相邻轴之间的转换是主要关注点时,这种方法可能是合适的。
修改颜色
alluvium 冲击带的边框颜色:geom_alluvium(color=”red”)
alluvium 冲击带的填充颜色:geom_alluvium(aes(fill=Dept))
stratum 层的边框颜色:geom_stratum(color=”blue”)
stratum 层的填充颜色:geom_stratum(aes(fill=Admit))
#########################
data <- as.data.frame(UCBAdmissions)
head(data)
library(ggalluvial)
gg <- ggplot(data, aes(y = Freq, axis1 = Gender, axis2 = Dept, axis3 = Admit)) +
geom_alluvium(color="red", aes(fill=Dept)) +

geom_stratum(color="blue", aes(fill=Dept)) +
geom_text(stat = "stratum", aes(label = paste(after_stat(stratum)))) +
ggtitle("UC Berkeley admissions and rejections")
gg
设置效果:
修改宽度
alluvium 冲击带的宽度:geom_alluvium(color=”red”, aes(fill=Dept),width=1/12)
stratum 层的宽度:geom_stratum(color=”blue”, aes(fill=Dept),width=1/12)
data <- as.data.frame(UCBAdmissions)
head(data)
library(ggalluvial)
gg <- ggplot(data, aes(y = Freq, axis1 = Gender, axis2 = Dept, axis3 = Admit)) +
geom_alluvium(color="red", aes(fill=Dept),width=1/12) +
geom_stratum(color="blue", aes(fill=Dept),width=1/12) +
geom_text(stat = "stratum", aes(label = paste(after_stat(stratum)))) +
ggtitle("UC Berkeley admissions and rejections")
gg
设置效果如下:
坐标轴颠倒
使用 coord_flip() 函数
#########################
data <- as.data.frame(UCBAdmissions)
head(data)
library(ggalluvial)
gg <- ggplot(data, aes(y = Freq, axis1 = Gender, axis2 = Dept, axis3 = Admit)) +
geom_alluvium(color="red", aes(fill=Dept),width=1/12) +
geom_stratum(color="blue", aes(fill=Dept),width=1/12) +
geom_text(stat = "stratum", aes(label = paste(after_stat(stratum)))) +
ggtitle("UC Berkeley admissions and rejections") +
coord_flip()
gg
修改x/y轴属性
坐标添加上刻度标签label,并修改填充颜色:
#########################
data <- as.data.frame(UCBAdmissions)
head(data)
library(ggalluvial)
gg <- ggplot(data, aes(y = Freq, axis1 = Gender, axis2 = Dept, axis3 = Admit)) +
geom_alluvium(color="red", aes(fill=Dept)) +
geom_stratum(color="black", aes(fill=Dept)) +
geom_text(stat = "stratum", aes(label = paste(after_stat(stratum)))) +
ggtitle("UC Berkeley admissions and rejections") +
scale_x_discrete(limits = c("Gender", "Dept","Admit")) +
scale_fill_brewer(type = "qual", palette = "Set2")
gg
ref:
introduction:https://jtr13./cc21fall2/ggalluvial-cheatsheet.html
cheat sheet:https:///seleven/cheat-sheets/ggalluvial/
blog:https:///@arnavsaxena96/all-about-alluvial-diagrams-21da1505520b
https://jtr13./cc21fall2/index.html
https://corybrunson./ggalluvial/
https://cran./web/packages/ggalluvial/ggalluvial.pdf
https://github.com/davidsjoberg/ggsankey
今天分享到这~