R绘图技巧25| 10种方法教你画出最靓的桑基/冲积/河流图!

西瓜站长 生信益站 2023-07-06 08:01 发表于湖北
图片

桑基图可视化网络内变量(或节点)之间的比例流。术语“冲积图”通常可以互换使用。然而,一些人认为冲积图可视化了网络随时间的变化,而不是不同变量的变化。

爱尔兰出生的工程师 Matthew HPR Sankey 给这些图表起了名字。桑基是英国皇家工程师协会的成员,他在土木工程师学会的会议纪要中首次展示了他的蒸汽机能量流图。在桑基的图表中,他直观地展示了实际蒸汽装置和理想蒸汽装置之间的差异(请注意,节点之间的链接表示热损失。实际的蒸汽装置显示,与理想化的蒸汽装置相比,热损失成比例地更多)。他的流程图引起了一些著名工程师的注意,他们后来认为这种视觉效果是“桑基图”。

图片
桑基在他的文章《蒸汽机的热效率》(1898 年)中找到了他的原始图表。

参考文献:https://www.azavea.com/blog/2017/08/09/six-sankey-diagram-tool/

桑基图在生物信息领域应用广泛,比如ceRNA网络可视化、细胞通讯上下游可视化等。

不多不少,今天站长给大伙介绍10种桑基图的绘制方法或者R包。

networkD3

动态桑基图了解下,在坐的佬儿。

# Load package
library(networkD3)

# Load energy projection data
URL <- "https://cdn.rawgit.com/christophergandrud/networkD3/master/JSONdata/energy.json"
Energy <- jsonlite::fromJSON(URL)


# Now we have 2 data frames: a 'links' data frame with 3 columns (from, to, value), and a 'nodes' data frame that gives the name of each node.
head( Energy$links )
head( Energy$nodes )

# Thus we can plot it
p <- sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
              Target = "target", Value = "value", NodeID = "name",
              units = "TWh", fontSize = 12, nodeWidth = 30)
p

# save the widget
# library(htmlwidgets)
# saveWidget(p, file=paste0( getwd(), "/HtmlWidget/sankeyEnergy.html"))

特色是绘制动态的桑基图。

图片

参考:https://r-graph-gallery.com/323-sankey-diagram-with-the-networkd3-library.html,https://rpubs.com/DragonflyStats/Sankey-networkD3

riverplot

啊哈,我能在地图上绘制河流图!

图片

还有著名的米纳德图:

图片
  • 米纳德图描述了 1812 年拿破仑从俄罗斯撤退的著名情节。

参考:https://cran.r-project.org/web/packages/riverplot/index.html

ggsankey

遵循图形语法,和 ggplot2 无缝衔接。

# install.packages("remotes")
# remotes::install_github("davidsjoberg/ggsankey")
library(ggsankey)
# install.packages("ggplot2")
library(ggplot2)
# install.packages("dplyr")
library(dplyr) # Also needed

ggplot(df, aes(x = x,
               next_x = next_x,
               node = node,
               next_node = next_node,
               fill = factor(node),
               label = node)) +
  geom_sankey(flow.alpha = 0.5, node.color = 1) +
  geom_sankey_label(size = 3.5, color = 1, fill = "white") +
  scale_fill_viridis_d() +
  theme_sankey(base_size = 16) +
  theme(legend.position = "none")
图片

ggalluvial

图形大法好,一下就有仨。这是第 2 个用于绘制冲积图的 ggplot2 拓展包。

# install.packages("ggalluvial")
library(ggalluvial)

data(vaccinations)

head(vaccinations)
#      survey freq subject response start_date   end_date
# 1 ms153_NSA   48       1   Always 2010-09-22 2010-10-25
# 2 ms153_NSA    9       2   Always 2010-09-22 2010-10-25
# 3 ms153_NSA   66       3   Always 2010-09-22 2010-10-25
# 4 ms153_NSA    1       4   Always 2010-09-22 2010-10-25
# 5 ms153_NSA   11       5   Always 2010-09-22 2010-10-25
# 6 ms153_NSA    1       6   Always 2010-09-22 2010-10-25

ggplot(data = vaccinations,
       aes(axis1 = survey,   # First variable on the X-axis
           axis2 = response, # Second variable on the X-axis
           axis3 = survey,   # Third variable on the X-axis
           y = freq)) +
  geom_alluvium(aes(fill = response)) +
  geom_stratum() +
  geom_text(stat = "stratum",
            aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Survey""Response"),
                   expand = c(0.150.05)) +
  theme_void()
图片

给大家表演下旋转,倒立!上下布局:

图片
coord_flip()

参考:https://r-charts.com/flow/ggalluvial/

ggbump

图形大法好,一下就有仨。这是第 3 个用于绘制冲积图的 ggplot2 拓展包。

ggbump:凹凸有致才是YYDS。

最简单的例子

ggplot(df, aes(year, rank, color = country)) +
    geom_bump()

毛胚房:

图片

基础版:

图片

高级货:

图片
图片
图片

限量版:

图片

参考:https://github.com/davidsjoberg/ggbump

alluvial

人人都说图形大法好,而我独爱base R

图片

参考:https://github.com/mbojan/alluvial

easyalluvial

杀疯了!easyalluvial表示不服,说前面的都是垃圾!还口口声声说一行代码即可创建冲积图!

可绘制交互式的图表:

suppressPackageStartupMessages( require(parcats) )

p = alluvial_wide(mtcars2, max_variables = 5)

parcats(p, marginal_histograms = TRUE, data_input = mtcars2)

这个是交互式的,动图可以去官网看:

图片

支持边际图的绘制:

图片
  • https://github.com/erblast/easyalluvial

其他方法

sankeyD3

  • https://github.com/fbreitwieser/sankeyD3

circlize::chordDiagram:环形和弦图

  • https://jokergoo.github.io/circlize_book/book/the-chorddiagram-function.html

hiervis:支持Sankey、Sunburst、Partition、Icicle 和 Treemap

  • https://github.com/fbreitwieser/hiervis

OK,今天的分享到此为止,希望能对您有所帮助。

您的关注、点赞、在看、转发是对益站最大的鼓励和支持哈。

图片

联系站长

对本篇文章有疑问,可以在益站发消息留言,也欢迎各位童鞋来 QQ837738558 进行交流学习

图片
我们的企鹅群

收录于合集 #绘图专题
 105
上一篇R绘图技巧24| 图中图— 在图片中插入表格(或者其它图片)下一篇R绘图技巧26| 热图聚类树中样品顺序修改 + 色块注释

微信扫一扫
关注该公众号