ggalluvial package in R - установка оси цвета аллювиальной заливки по оси (а не только по конечной оси) - PullRequest
0 голосов
/ 26 марта 2019

В настоящее время я пытаюсь создать аллювиальный график в R с пакетом ggalluvial .С его помощью я хочу построить последовательную миграцию между несколькими значениями в последовательных сегментах времени (Seg1, Seg2, Seg3, Seg4).На 1-м сегменте все случаи имеют значение «рабочий сегмент»;в сегменте 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")

... Мне удалось создать следующий график:

...enter image description here

Мой главный вопрос:

1) Есть ли способ, с помощью которого цвет аллювиальной заливки может быть непостоянным по всей аллювиальной нитиот начала до конца, основываясь на значении Seg4, но INSTEAD, чтобы иметь ось изменения цвета по оси, основанную на текущем значении оси?Например, Я бы хотел, чтобы все нити со значением страт "workseg" на данной оси были голубыми между этой осью и предыдущей осью. Что-то похожее на это кажется возможным на основе примера прививок внижняя часть этой виньетки (см. последний график над приложением).Заполнения в этом примере отражают слои, от которых они произошли, от оси к оси (например, все нити, приходящие от слоев «Никогда», представляют собой чирок, независимо от их значения на следующей оси).Я в основном хочу реализовать обратное к этому - то есть заполнение на основе страт оси next (например, все нити, ведущие к стратам "workseg", синие, независимо от того,где их значение на предыдущей оси).

Не связанный, вторичный вопрос:

2) Есть ли какие-либо средства, с помощью которых можно добавить аннотации к аллювию?То есть они содержат метки слоев, основанные на значениях в наборе данных, но есть ли способ добавить метки или другую аннотативную информацию к самим нитям (помимо ручного в постпроизводстве)?

1 Ответ

1 голос
/ 28 марта 2019

В примере с прививками потоки перенимают эстетику от страт до их левых через geom_flow() с 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")

Создано в 2019-03-28 пакетом Представление (v0.2.1)

При отражении соглашения об именах для параметра aes.flow и его опций "forward" и "backward" могут быть не самыми интуитивными. Я бы приветствовал предложения по этому поводу!

...