【问题标题】:R from grouped dataframe to Sankey diagramR从分组数据框到桑基图
【发布时间】:2018-10-19 06:13:03
【问题描述】:

我昨天大部分时间都花在以下问题上,但还没有找到解决以下问题的方法:

我有一个包含分类数据的数据框:比如 category1:具有值 A 和 B;另一列 category2 的值​​为 C、D、F、G; category3 的值为 H 等等...

我想制作一个 Sankey 图,显示类别 1 A 中有多少(通过从节点到节点的带宽)在 C、D、F、G 中。这对于分组数据帧中的所有其他组合也是如此.

它基本上是一棵树,其分支的宽度显示特定分支中有多少计数。

有没有办法以灵活的方式做到这一点,以便它适用于分类 DF 中的大多数分组?

【问题讨论】:

    标签: r dataframe tree grouping sankey-diagram


    【解决方案1】:

    您可以尝试使用漂亮的 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")
    

    【讨论】:

    • @DCB 是否为您提供了您正在寻找的内容?
    【解决方案2】:

    如果您愿意将数据重新排列到节点列表和边缘列表中,您可以利用带有 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")
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2019-10-20
      • 2018-11-02
      • 2016-04-06
      • 2012-04-15
      • 2018-10-18
      • 1970-01-01
      • 2022-10-18
      相关资源
      最近更新 更多