R 中的 ggalluvial 包 - 按轴设置冲积填充颜色(而不是仅按最终轴)

jjc*_*cii 0 plot r data-visualization ggplot2

我目前正在尝试使用 Rggalluvial生成冲积图。我希望用它来绘制连续时间段(Seg1、Seg2、Seg3、Seg4)内不同值之间的多个连续迁移。在 Seg 1 中,所有案例都具有“workseg”值;在 Seg 2 处,该值可以是其他三个值之一(相关内容、不相关内容、NONE);Seg3 和 Seg4 值可以是四个选项中的任何一个。

使用以下代码...

##Reorder levels per segment (make vertical order of strata levels identical 
across all axes, rather than "zig-zag" --> this is just an aesthetic 
preference)##

dRG.lode <- dRG %>%
  mutate(Seg2 = factor(Seg2, levels=c("workseg", "related content", 
"unrelated content", "NONE")),
         Seg3 = factor(Seg3, levels=c("workseg", "related content", 
"unrelated content", "NONE")),
         Seg4 = factor(Seg4, levels=c("workseg", "related content", 
"unrelated content", "NONE")))


##Plot##

ggplot(as.data.frame(dRG.lode),
       aes(axis1 = Seg1, axis2 = Seg2, axis3 = Seg3, axis4 = Seg4)) +
  geom_alluvium(aes(fill = Seg4), width = 1/12) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_label(stat = "stratum", label.strata = TRUE) +
  scale_x_discrete(limits = c("Seg1", "Seg2", "Seg3", "Seg4"), expand = 
c(.05, .05, .05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("Time Course, Segment by Segment")
Run Code Online (Sandbox Code Playgroud)

...我已经能够制作以下情节:

...在此处输入图像描述

我的主要问题:

1) 是否有一种方法可以根据 Seg4 值,使冲积土填充颜色从开始到结束在整个冲积土链上不一致,而不是根据当前轴值逐轴改变颜色?例如,我希望给定轴上层值为“workseg”的所有股线在该轴和前一个轴之间为蓝色。根据本小插图 底部的疫苗接种示例,类似的情况似乎是可能的(参见附录上方的最后一个图)。该示例中的填充反映了它们各自来自的层(例如,来自“从不”层的所有线都是青色的,无论它们在下一个轴上的值如何)。我基本上想实现与此相反的功能 - 即基于下一个轴的层进行填充(例如,通向“workseg”层的所有股线都是蓝色的,无论它们在前一个轴的值​​在哪里)。

一个不相关的次要问题:

2)有什么方法可以给alluvia添加注释吗?也就是说,它们的轴包含基于数据集中的值的层标签,但是是否有一种方法可以向线本身添加标签或其他注释信息(超出后期制作中的手动方式)?

Cor*_*son 5

geom_flow()在疫苗接种示例中,流通过with fill = response(层变量)采用从左侧层开始的美学;这不能使用 来完成geom_alluvium(),它将每个完整的冲积层渲染为单个图形对象(“grob”)。您链接到的数据采用ggalluvial认为的“宽”格式,即每个轴都是一个变量,但为了具有一致的层变量,数据需要采用“长”格式。

下面的代码进行了这两项更改并使用aes.flow = "backward"(请参阅文档)让流程采用从层到其右侧(而不是左侧)的美学。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)
library(ggalluvial)

dRG <- read.csv("~/Downloads/mydata.csv")

dRG.lode <- dRG %>%
  mutate(Seg2 = factor(Seg2, levels=c("workseg", "related content", 
                                      "unrelated content", "NONE")),
         Seg3 = factor(Seg3, levels=c("workseg", "related content", 
                                      "unrelated content", "NONE")),
         Seg4 = factor(Seg4, levels=c("workseg", "related content", 
                                      "unrelated content", "NONE")))

dRG.long <- to_lodes_form(dRG.lode, -X,
                          key = "segment", value = "value", id = "id")

ggplot(dRG.long,
       aes(x = segment, stratum = value, alluvium = id)) +
  geom_flow(aes(fill = value), width = 1/12, aes.flow = "backward") +
  guides(fill = FALSE) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_label(stat = "stratum", label.strata = TRUE) +
  scale_x_discrete(limits = c("Seg1", "Seg2", "Seg3", "Seg4"), expand = 
                     c(.05, .05, .05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("Time Course, Segment by Segment")
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.2.1)于 2019-03-28 创建

经过反思,参数aes.flow及其选项的命名约定"forward"可能"backward"不是最直观的。我欢迎对此提出建议!