使用R画桑基图(流程图)

桑基图可以用来表示各个节点之间转换

在R中可以直接定义点点之间的关系后使用相应的package画桑基图:


方法一:

riverplot

library(riverplot)

# 构造连接节点的数据框
edges = data.frame(N1 = paste0(rep(LETTERS[1:4], each = 4), rep(1:5, each = 16)),
                   N2 = paste0(rep(LETTERS[1:4], 4), rep(2:6, each = 16)),
                   Value = runif(80, min = 2, max = 5) * rep(c(1, 0.8, 0.6, 0.4, 0.3), each = 16),
                   stringsAsFactors = F)
# 筛选80%的记录,以免每个点都对应到4个点
edges = edges[sample(c(TRUE, FALSE), nrow(edges), replace = TRUE, prob = c(0.8, 0.2)),]
head(edges)


nodes = data.frame(ID = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)
#
nodes$x = as.integer(substr(nodes$ID, 2, 2))
nodes$y = as.integer(sapply(substr(nodes$ID, 1, 1), charToRaw)) - 65
#
rownames(nodes) = nodes$ID
head(nodes)


# 添加颜色
library(RColorBrewer)
# 后面加调淡颜色
palette = paste0(brewer.pal(4, "Set1"), "60")

# 对每个节点生成相应的格式
styles = lapply(nodes$y, function(n) {
  list(col = palette[n+1], lty = 0, textcol = "black")
})
names(styles) = nodes$ID


# 以list的结构保存一遍调用
rp <- list(nodes = nodes, edges = edges, styles = styles)
class(rp) <- c(class(rp), "riverplot")
plot(rp, plot_area = 0.95, yscale=0.06)

效果图见:



方法二:

使用包d3Network或者circlize,d3Network是调用D3的画图功能来实现,使用一下代码实现:

library(d3Network)
d3links <- edges
d3nodes <- data.frame(name = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)
d3nodes$seq <- 0:(nrow(d3nodes) - 1)

d3links <- merge(d3links, d3nodes, by.x="N1", by.y="name")
names(d3links)[4] <- "source"

d3links <- merge(d3links, d3nodes, by.x="N2", by.y="name")
names(d3links)[5] <- "target"
names(d3links)[3] <- "value"

d3links <- subset(d3links, select=c("source", "target", "value"))
d3nodes <- subset(d3nodes, select=c("name"))

# 画图并保存为html文件
d3Sankey(Links = d3links, Nodes = d3nodes, Source = "source",
         Target = "target", Value = "value", NodeID = "name",
         fontsize = 12, nodeWidth = 30, file = "TestSankey.html")


效果图:



备注:

(1)d3Network保存为HTML文件,有交互式效果;riverplot可选择保存为不同的图片类型

(2)操作中感觉使用riverplot更易调整


桑基图(Sankey diagram)是一种流程图,用于表示流量、能量、材料等资源在系统内部的转移。在R语言中,可以使用包ggplot2和ggalluvial来创建桑基图。 首先,我们需要安装并加载这两个包: ```r install.packages("ggplot2") install.packages("ggalluvial") library(ggplot2) library(ggalluvial) ``` 然后,我们可以使用以下代码创建一个简单的桑基图: ```r data <- data.frame(from = c("A", "A", "B", "B", "C"), to = c("B", "C", "C", "D", "D"), value = c(10, 20, 30, 40, 50)) ggplot(data, aes(axis1 = from, axis2 = to, y = value)) + geom_alluvium(aes(fill = from), width = 0.1) + geom_stratum(width = 1/8, fill = "grey", color = "black") + theme_void() ``` 这将创建一个包含三个节点的桑基图,其中节点A、B和C之间的流量表示为从A到B、从A到C、从B到C、从B到D和从C到D的线。 我们还可以自定义桑基图的颜色、标签和样式。例如,以下代码创建一个包含四个节点的桑基图,其中节点A、B、C和D之间的流量表示为从A到B、从A到C、从B到C、从B到D、从C到D和从C到A的线: ```r data <- data.frame(from = c("A", "A", "B", "B", "C", "C"), to = c("B", "C", "C", "D", "D", "A"), value = c(10, 20, 30, 40, 50, 60)) ggplot(data, aes(axis1 = from, axis2 = to, y = value)) + geom_alluvium(aes(fill = from), width = 0.1) + geom_stratum(width = 1/8, fill = "grey", color = "black") + scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73", "#F0E442")) + ggtitle("Customized Sankey Diagram") + theme_void() + theme(plot.title = element_text(hjust = 0.5, size = 20, face = "bold"), axis.text.y = element_text(size = 16), axis.text.x = element_text(size = 16), axis.title = element_blank()) ``` 此代码将节点A、B、C和D分别着色为橙色、蓝色、绿色和黄色,并添加了标题和自定义字体大小和样式。 总之,R语言中的ggplot2和ggalluvial包提供了创建自定义桑基图的灵活和简单的方法,可以用于可视化各种类型的数据流程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值