Диаграмма Санки в R: Как изменить высоту (Y) отдельных секций, связанных с каждым узлом? - PullRequest
2 голосов
/ 10 марта 2019

Проблема

Как изменить высоту каждого раздела / узла на диаграмме Санки 1004 *?Я хочу создать что-то вроде рисунка 1 ниже, где раздел «пол» маленький, затем раздел «потому что» большой, а затем раздел «возраст» снова маленький:

Image 1

Мой вывод больше похож на Рисунок 2, где каждая секция (Топливо, Секторы, Конечное использование, Устройства преобразования) имеет одинаковую высоту:

Image 2

Код:

library(ggplot2)
library(ggalluvial)
library(RColorBrewer)

dfs <- dftest[ , c("Hospital", "Paciente", "Terapia", "Unit")]
alpha <- 1
getPalette <- colorRampPalette(brewer.pal(12, "Set3"))
colourCount <- length(unique(dfs$Hospital))
ggplot(dfs,
       aes(axis1 = Hospital, axis2 = Paciente, axis3=Terapia)) +
  geom_alluvium(aes(fill = Hospital), 
                width = 1/12, alpha = alpha, knot.pos = 0.5) +
  geom_stratum(width = 1/20) +
  scale_x_continuous(breaks = 1:3, labels = c("Hospital", "Patient", "Therapy")) +
  scale_fill_manual(values = getPalette(colourCount)) +
  ggtitle("Teste") +
  theme_minimal() +
  theme( legend.position = "none", panel.grid.major = element_blank(),
         panel.grid.minor = element_blank(), axis.text.y = element_blank(),
         axis.text.x = element_text(size = 12, face = "bold"))

У меня есть 3 секции / узлы, центры (24 уникальных), пациенты (750 уникальных) и методы лечения (10 уникальных).Итак, я подумал, что мог бы создать диаграмму Санки, подобную изображению 1. Ниже вы можете найти dput(dfs) для составленного набора данных, поскольку мой набор данных слишком большой (750 человек), чтобы включать его сюда.

dput(dfs)
structure(list(Hospital = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("1", 
"2", "3", "4", "5"), class = "factor"), Paciente = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L
), .Label = c("21", "22", "23", "24", "25", "26", "27"), class = "factor"), 
    Terapia = structure(c(2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
    3L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 
    1L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
    3L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("Adalimumab", 
    "Etanercept", "Infliximab", "Rituximab"), class = "factor"), 
    Unit = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), class = "data.frame", row.names = c(NA, 
-65L))

Может кто-нибудь, пожалуйста, посоветуйте?

1 Ответ

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

Я думаю, что geom пакета ggalluvial не были предназначены для свободно плавающих секций. Однако, как отметил его создатель в виньетке пакета, пакет ggforce имеет нечто похожее, если вы ищете следующий вид:

plot

Используемый код:

library(ggforce)

# transform dataframe into appropriate format
dfs2 <- gather_set_data(dfs, 1:3)

# define axis-width / sep parameters once here, to be used by
# each geom layer in the plot
aw <- 0.1
sp <- 0.1

ggplot(dfs2, 
       aes(x = x, id = id, split = y, value = Unit)) +
  geom_parallel_sets(aes(fill = Hospital), alpha = 0.3, 
                     axis.width = aw, sep = sp) +
  geom_parallel_sets_axes(axis.width = aw, sep = sp) +
  geom_parallel_sets_labels(colour = "white", 
                            angle = 0, size = 3,
                            axis.width = aw, sep = sp) +
  theme_minimal()

Вот несколько демонстраций с различными значениями параметров:

demonstrations

...