用于可视化离散和连续面板数据的加权sankey /冲积图?

时间:2017-03-27 17:59:08

标签: r charts visualization data-visualization sankey-diagram

问题

我试图想象个人面板数据,包括离散或分类选择以及每个时间段的连续选择。这种情况的一个常见示例是客户购买产品/订阅,然后选择使用产品/服务的频率。

我想展示"流动"在每个时间段内由连续变量加权的时间段 - 加权堆积条形图和sankey或冲积图之间的某种交叉。 Sankey和冲积图从根本上代表节点之间的流量,其中每个流量具有单个量值。相反,我想展示"流动"表示在不同时间段内可能具有不同值的连续选择,即使对于同一个体也是如此。得到的图表看起来非常类似于sankey或冲积图,除了alluvia或" flow"将逐渐改变时间段之间的宽度。例如,假设客户在两个时间段内购买相同的订阅,但在第二个时间段内更频繁地使用它;这种用法可以用一个乐队或者#34; flow"从第一个时间段到第二个时间段的宽度增加。

  1. 此图表类型是否已存在于任何位置?我无法在相当广泛的搜索中找到任何示例。如果它不存在,我希望这种图表类型的价值是明确的,并且有人会命名并创建它! :)
  2. 这样的图表如何被"黑客攻击"在R中使用现有的冲积或sankey库?我想这不是一件容易的事,因为这些图表类型是由节点之间的恒定流量定义的。
  3. R

    中的示例

    我将使用R来解释问题。这是一个示例数据集:

    library(tidyr)
    library(dplyr)
    library(alluvial)
    library(ggplot2)
    library(forcats)
    
    set.seed(42)
    individual <- rep(LETTERS[1:10],each=2)
    timeperiod <- paste0("time_",rep(1:2,10))
    discretechoice <- factor(paste0("choice_",sample(letters[1:3],20, replace=T)))
    continuouschoice <- ceiling(runif(20, 0, 100))
    d <- data.frame(individual, timeperiod, discretechoice, continuouschoice)
    

    我可以很好地可视化离散或分类选择片的面板数据。堆积条形图可用于显示每个类别中的个人数量如何随时间变化。冲积图或sankey图还可以显示导致类别总数发生变化的各个运动。例如:

    # stacked bar diagram of discrete choice by individual
    g <- ggplot(data=d,aes(timeperiod,fill=fct_rev(discretechoice)))
    g + geom_bar(position="stack") + guides(fill=guide_legend(title=NULL))
    
    
    # alluvial diagram of discrete choice by individual
    d_alluvial <- d %>%
      select(individual,timeperiod,discretechoice) %>%
      spread(timeperiod,discretechoice) %>%
      group_by(time_1,time_2) %>%
      summarize(count=n()) %>%
      ungroup()
    alluvial(select(d_alluvial,-count),freq=d_alluvial$count)
    

    Stacked Bar and Alluvial Diagrams

    我还可以通过对堆积条形图进行加权来按类别和跨时间段查看连续选择总计。

    # stacked bar diagram of discrete choice, weighting by continuous choice
    g + geom_bar(position="stack",aes(weight=continuouschoice))
    

    Weighted Stacked Bar

    但是,我不能添加任何类型的个人&#34;流动&#34;跨时间段到此加权堆积条形图。那些&#34;流动&#34;在时间段1中将具有与在时间段2中不同的宽度,因此它们将需要被显示为在时间段之间逐渐改变的宽度。相比之下,Sankey和冲积图对于每个流动具有单一的幅度或宽度。

1 个答案:

答案 0 :(得分:6)

在开始将冲积包改为 ggplot2 框架时,我遇到了这种混乱。对于Sankey和冲积图来说,将重量从一个位置改变到另一个位置并不罕见,但冲积并不是为了处理适合编码它的格式的数据而构建的。 (编辑:冲积 中的alluvial_ts()功能 - 请参阅README中的示例 - 但它不会产生堆叠直方图每个时期。)

一种选择可能是在 ggforce 的开发版本中使用the parallel set geoms,尽管我自己并不熟悉它们。另一个我知道的是我自己的ggalluvial。我认为,这是您的问题的一个解决方案,使用您的数据集d(请注意颜色不同):

library(ggalluvial)
ggplot(
  data = d,
  aes(
    x = timeperiod,
    stratum = discretechoice,
    alluvium = individual,
    y = continuouschoice
  )
) +
  geom_stratum(aes(fill = discretechoice)) +
  geom_flow()

alluvial diagram in ggplot2

也可以在时间段之间为流动着色;看看例子。

我无法找到对数据格式差异的良好讨论,即每行对应一个主题的所有时间段与一个主题在一个时间段,所以我尝试在{{{ 3}}。如果您有任何建议,我很高兴听到他们的意见!