临床结果分类之间如何展示关联性,一个桑基图搞定它!
点击蓝字 关注我们
小伙伴们大家好,我是你们的大海哥!最近大海哥发现很多小伙伴都有类似的需求,就是想把一些分类变量通过样本名联系起来,看看整体的一个趋势,但是又不知道有什么图类可以实现这种需求。那么今天大海哥就给大家推荐一个好用直观且可以展示不同分类变量之间的联系的桑基图。让我们先来了解一下,什么是桑基图?
桑基图(Sankey diagram),又叫桑基能量分流图或者桑基能量平衡图,可从线条的走向,粗细的变化和节点间的比较对数据进行分析,同时可以帮助大家更直观地理解复杂的数据关系。
桑基图通常由一系列连接的箭头表示,每个箭头表示一个特定的流动或转换,箭头的宽度可以表示数量、流量或其他度量指标。图中的节点代表不同的环节或状态,它们之间通过箭头连接,形成了流动的路径。桑基图的颜色、标签和其他可视化元素可以用来传达更多信息,帮助观察者更好地理解数据。
了解了具体的原理后,大家一定就很好奇该怎么去展开绘制了!别着急,大海哥已经准备了多种代码实现方式,大家慢慢食用哦!
#本次桑基图主要代码通过一种基于ggplot2的R包ggalluvial包来实现。
#加载包
library(ggalluvial)
#看看我们测试用的数据
head(as.data.frame(UCBAdmissions))
#先画个普通的桑基图看看
ggplot(as.data.frame(UCBAdmissions),
aes(y = Freq, axis1 = Gender, axis2 = Dept)) +
geom_alluvium(aes(fill = Admit), width = 1/14) +
geom_stratum(width = 1/8, fill = "green",color = "black") + #设置节点及边框颜色
geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #设置节点标签
scale_x_discrete(limits = c("Gender", "Dept"),
expand = c(0, 0)) +
scale_fill_brewer(type = "qual",palette = 6) + #颜色填充
ggtitle("UC Berkeley admissions and rejections, by sex and department")
大家肯定觉得颜色不好看,大海哥也这么觉得,所以可以自定义一下颜色
ggplot(as.data.frame(HairEyeColor), aes(y = Freq,axis1 = Hair, axis2 = Eye, fill = Eye,axis3 = Sex))+
geom_flow()+
geom_alluvium(aes(fill = Eye),
curve_type = "sine") +
#这里就是定义颜色哦!可以自己调节喜欢的颜色
scale_fill_manual(values = c(Brown = "#70493D",
Hazel = "#E2AC76",
Green = "#3F752B",
Blue = "#81B0E4")) +
guides(fill = "none") +
geom_stratum(alpha = .2) +
geom_text(stat = "stratum",
size=3,
aes(label = after_stat(stratum)),
reverse = T) +
scale_x_continuous(breaks = 1:3,
expand = c(0,0),
labels = c("Hair", "Eye", "Sex")) +
ggtitle("Eye colors of 592 subjects, by sex and hair color")
还可以通过ggplot2的内置方法直接画哦!
ggplot(vaccinations,
aes(x = survey,
stratum = response,
alluvium = subject,
y = freq,
fill = response,
label = response)) +
scale_x_discrete(expand = c(0, 0 )) +
geom_flow() +
geom_stratum(alpha = .5) +
geom_text(stat = "stratum", size = 3) +
theme(legend.position = "none") +
ggtitle("vaccination survey responses at three points in time")
着是不是也还不错
还可以基于ggfittext方法修改节点标签哦
ggplot(vaccinations,
aes(x = survey,
stratum = response,
alluvium = subject,
y = freq,
fill = response,
label = response)) +
scale_x_discrete(expand = c(.1, 0)) +
geom_flow(width = 1/4) +
geom_stratum(alpha = .5, width = 1/4) +
ggfittext::geom_fit_text(stat = "stratum",
width = 1/4,
min.size = 3) + #修改支点标签
theme(legend.position = "none") +
ggtitle("vaccination survey responses", "labeled using `geom_fit_text()`")
会自动修改节点标签大小,是不是看起来效果会好得多?
不仅如此,ggauuvial包还可以绘制分面桑基图,多个支点桑基图等。这里大海哥就不一一介绍了。同时桑基图不仅仅可以用于生物信息学领域,其在多个领域中都有广泛的应用,包括能源管理、产业生产、物流分析、环境研究等。例如在能源流动分析方面:桑基图可以用来展示能源在不同来源、消耗者和转换过程之间的流动,帮助研究人员和决策者了解能源的分配和利用情况。是不是很不错?
点击“阅读原文”进入网址