用于可视化离散和连续面板数据的加权桑基/冲积图?
Weighted sankey / alluvial diagram for visualizing discrete and continuous panel data?
问题
我正在尝试可视化个人的面板数据,其中包括离散或分类选择以及每个时间段的连续选择。这种情况的一个常见示例是客户购买 product/subscription,然后选择 product/service.
的使用频率
我想显示 "flows" 跨时间段由连续变量 在每个时间段 加权 - 加权堆积条形图和之间的某种交叉桑基图或冲积图。 Sankey 和冲积图从根本上表示节点之间的流量,其中每个流量都有一个大小。相反,我想展示 "flows" 代表一个连续的选择,它在不同的时间段可能有不同的值,即使对于同一个人也是如此。生成的图表看起来与 sankey 或冲积地块非常相似,除了冲积层或 "flows" 会在时间段之间逐渐改变宽度。例如,假设客户在两个时间段购买同一个订阅,但在第二个时间段使用频率更高;该使用可以由宽度从第一个时间段到第二个时间段增加的带或 "flow" 表示。
- 这种图表类型是否已存在?我无法在相当广泛的搜索中找到任何示例。如果它不存在,我希望这种图表类型的价值是明确的,并且有人会命名并创建它! :)
- 如何使用现有的 alluvial 或 sankey 库在 R 中 "hacked" 这样的图?我想这不是微不足道的,因为这些图表类型是由节点之间的恒定流量定义的。
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)
我可以很好地可视化离散或分类选项的面板数据。堆叠条形图可用于显示每个类别中的个人数量如何随时间变化。冲积图或桑基图还可以显示导致类别总数变化的个别运动。例如:
# 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 diagram of discrete choice, weighting by continuous choice
g + geom_bar(position="stack",aes(weight=continuouschoice))
但是,我无法将任何类型的个人 "flows" 跨时间段添加到此加权堆积条形图中。这些 "flows" 在时间段 1 中的宽度与时间段 2 中的宽度不同,因此需要将它们显示为在时间段之间逐渐变化的宽度。相比之下,Sankey 和冲积图对每个流量都有一个大小或宽度。
在开始将 alluvial 包适应 ggplot2 框架时,我遇到了这种困惑。 Sankey 和冲积图从一个位置到另一个位置改变权重的情况并不少见,但是 alluvial 并不是为了以适合编码的格式处理数据而构建的。 (编辑:alluvial 中的 alluvial_ts()
函数是 ——参见 README 中的示例——但它不是在每个时间段生成堆叠直方图。)
一个选项可能是使用 the parallel set geoms in the development version of ggforce, though i'm not familiar with them myself. The other I'm aware of is my own, ggalluvial。我认为,这是您的问题的一种解决方案,使用您的数据集 d
(注意颜色不同):
library(ggalluvial)
ggplot(
data = d,
aes(
x = timeperiod,
stratum = discretechoice,
alluvium = individual,
y = continuouschoice
)
) +
geom_stratum(aes(fill = discretechoice)) +
geom_flow()
还可以为时间段之间的流量着色;查看示例。
我找不到关于数据格式差异的很好的讨论,即每一行对应所有时间段的一个主题,而不是一个时间段的一个主题,所以我尝试在 the vignette。如果您有任何建议,我很乐意听取!
问题
我正在尝试可视化个人的面板数据,其中包括离散或分类选择以及每个时间段的连续选择。这种情况的一个常见示例是客户购买 product/subscription,然后选择 product/service.
的使用频率我想显示 "flows" 跨时间段由连续变量 在每个时间段 加权 - 加权堆积条形图和之间的某种交叉桑基图或冲积图。 Sankey 和冲积图从根本上表示节点之间的流量,其中每个流量都有一个大小。相反,我想展示 "flows" 代表一个连续的选择,它在不同的时间段可能有不同的值,即使对于同一个人也是如此。生成的图表看起来与 sankey 或冲积地块非常相似,除了冲积层或 "flows" 会在时间段之间逐渐改变宽度。例如,假设客户在两个时间段购买同一个订阅,但在第二个时间段使用频率更高;该使用可以由宽度从第一个时间段到第二个时间段增加的带或 "flow" 表示。
- 这种图表类型是否已存在?我无法在相当广泛的搜索中找到任何示例。如果它不存在,我希望这种图表类型的价值是明确的,并且有人会命名并创建它! :)
- 如何使用现有的 alluvial 或 sankey 库在 R 中 "hacked" 这样的图?我想这不是微不足道的,因为这些图表类型是由节点之间的恒定流量定义的。
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)
我可以很好地可视化离散或分类选项的面板数据。堆叠条形图可用于显示每个类别中的个人数量如何随时间变化。冲积图或桑基图还可以显示导致类别总数变化的个别运动。例如:
# 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 diagram of discrete choice, weighting by continuous choice
g + geom_bar(position="stack",aes(weight=continuouschoice))
但是,我无法将任何类型的个人 "flows" 跨时间段添加到此加权堆积条形图中。这些 "flows" 在时间段 1 中的宽度与时间段 2 中的宽度不同,因此需要将它们显示为在时间段之间逐渐变化的宽度。相比之下,Sankey 和冲积图对每个流量都有一个大小或宽度。
在开始将 alluvial 包适应 ggplot2 框架时,我遇到了这种困惑。 Sankey 和冲积图从一个位置到另一个位置改变权重的情况并不少见,但是 alluvial 并不是为了以适合编码的格式处理数据而构建的。 (编辑:alluvial 中的 alluvial_ts()
函数是 ——参见 README 中的示例——但它不是在每个时间段生成堆叠直方图。)
一个选项可能是使用 the parallel set geoms in the development version of ggforce, though i'm not familiar with them myself. The other I'm aware of is my own, ggalluvial。我认为,这是您的问题的一种解决方案,使用您的数据集 d
(注意颜色不同):
library(ggalluvial)
ggplot(
data = d,
aes(
x = timeperiod,
stratum = discretechoice,
alluvium = individual,
y = continuouschoice
)
) +
geom_stratum(aes(fill = discretechoice)) +
geom_flow()
还可以为时间段之间的流量着色;查看示例。
我找不到关于数据格式差异的很好的讨论,即每一行对应所有时间段的一个主题,而不是一个时间段的一个主题,所以我尝试在 the vignette。如果您有任何建议,我很乐意听取!