【问题标题】:sankey/alluvial diagram with percentage and partial fill in R带有百分比和部分填充的桑基/冲积图 R
【发布时间】:2020-09-30 23:11:24
【问题描述】:

我想使用 ggplot2ggalluvial 修改现有的 sankey 图,使其更具吸引力

我的例子来自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 package (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 步。

【问题讨论】:

    标签: r ggplot2 dataflow sankey-diagram


    【解决方案1】:

    这可以这样实现:

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

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

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

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

    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")
    

    【讨论】:

    • 感谢您的帮助,这个解决方案看起来非常不错。关于 2.,如何将百分比添加到每个层的值旁边(如示例图中)?
    • 嗨@captcoma。我刚刚进行了编辑以将百分比添加到标签中。最佳 S.
    猜你喜欢
    • 2020-09-05
    • 2021-10-16
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多