[英]R from grouped dataframe to Sankey diagram
我昨天大部分時間都在解決以下問題,但尚未找到解決以下問題的方法:
我有一個包含分類數據的數據框:比如 category1:具有值 A 和 B; 另一列 category2 具有值 C、D、F、G; category3 有值 H 等等...
我想制作一個桑基圖,顯示類別 1 A 中有多少(通過從節點到節點的波段寬度)在 C、D、F、G 中。這也適用於分組數據幀中的所有其他組合。
它基本上是一棵樹,樹枝的寬度顯示了特定樹枝中有多少計數。
有沒有辦法以靈活的方式執行此操作,以便它適用於分類 DF 中的大多數分組?
您可以嘗試使用漂亮的 ggalluvial 包:
library(ggalluvial)
library(ggplot2)
# some fake data
data <- data.frame(column1 = c('A','A','A','B','B','B')
,column2 = c('C','D','E','C','D','E')
, column3 = c('F','G','H','I','J','K')
)
# add a costant as frequencies: if each "flow" count as 1, you can do this
data$freq <- 1
# here the plot
ggplot(data,
aes(y = freq, axis1 = column1, axis2 = column2, axis3 = column3)) +
geom_alluvium(aes(), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "blue") +
geom_label(stat = "stratum", label.strata = TRUE) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("nice sankey")
如果您願意將數據重新排列為節點列表和邊列表,則可以利用帶有networkD3
包的 D3 javascript 庫。 這是一個帶有虛擬數據的示例(請注意,要使用此庫,您需要有一個以 0 開頭的 id 列。
library(tidyverse)
nodes <- tibble(id = c(0:9), label = c(1:10))
edges <- tibble(from = c(5:15, 0:4, 16:19), to = (0:19), weight = rnorm(20))
library(networkD3)
sankeyNetwork(Links = edges,
Nodes = nodes,
Source = "from",
Target = "to",
NodeID = "label",
Value = "weight")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.