簡體   English   中英

R 從分組數據框到桑基圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM