首页 > 解决方案 > 带有百分比和部分填充的桑基/冲积图 R

问题描述

我想修改现有的 sankey 情节ggplot2,并ggalluvial使其更具吸引力

我的例子来自https://corybrunson.github.io/ggalluvial/articles/ggalluvial.html

library(ggplot2)
library(ggalluvial)

data(vaccinations)
levels(vaccinations$response) <- rev(levels(vaccinations$response))
ggplot(vaccinations,
       aes(x = survey, stratum = response, alluvium = subject,
           y = freq,
           fill = response, label = response)) +
  scale_x_discrete(expand = c(.1, .1)) +
  geom_flow() +
  geom_stratum(alpha = .5) +
  geom_text(stat = "stratum", size = 3) +
  theme(legend.position = "none") +
  ggtitle("vaccination survey responses at three points in time")

reprex 包(v0.3.0)于 2020 年 10 月 1 日创建

现在,我想更改此图,使其看起来类似于https://sciolisticramblings.wordpress.com/2018/11/23/sankey-charts-the-new-pie-chart/中的图,即 1. 更改绝对相对于相对值(百分比) 2. 添加百分比标签和 3. 应用部分填充(例如“缺失”和“从不”) 在此处输入图像描述

我的方法: 我想我可以将轴更改为百分比,例如:scale_y_continuous(label = scales::percent_format(scale = 100)) 但是,我不确定第 2 步和第 3 步。

标签: rggplot2dataflowsankey-diagram

解决方案


这可以像这样实现:

  1. 更改为百分比可以通过在您的 df 中添加一个带有调查百分比份额的新列来实现,然后可以将其映射到y而不是freq.

  2. 要获得不错的百分比标签,您可以使用scale_y_continuous(label = scales::percent_format())

  3. 对于部分填充,您可以映射例如response %in% c("Missing", "Never")fill提供TRUE“缺失”和“从不”)并通过以下方式设置填充颜色scale_fill_manual

  4. 每个层的百分比可以通过我使用变量并计算的地方添加到标签label = paste0(..stratum.., "\n", scales::percent(..count.., accuracy = .1))中。geom_text..stratum....count..stat_stratum

library(ggplot2)
library(ggalluvial)
library(dplyr)

data(vaccinations)
levels(vaccinations$response) <- rev(levels(vaccinations$response))

vaccinations <- vaccinations %>% 
  group_by(survey) %>% 
  mutate(pct = freq / sum(freq))

ggplot(vaccinations,
       aes(x = survey, stratum = response, alluvium = subject,
           y = pct,
           fill = response %in% c("Missing", "Never"), 
           label = response)) +
  scale_x_discrete(expand = c(.1, .1)) +
  scale_y_continuous(label = scales::percent_format()) +
  scale_fill_manual(values = c(`TRUE` = "cadetblue1", `FALSE` = "grey50")) +
  geom_flow() +
  geom_stratum(alpha = .5) +
  geom_text(aes(label = paste0(..stratum.., "\n", scales::percent(..count.., accuracy = .1))), stat = "stratum", size = 3) +
  theme(legend.position = "none") +
  ggtitle("vaccination survey responses at three points in time")


推荐阅读