Диаграммы Санки в R?

87

Я пытаюсь визуализировать поток данных с помощью диаграммы Санки в R.

Я обнаружил, что это сообщение в блоге ссылается на сценарий R, который создает диаграмму Санки, к сожалению, он довольно сырой и несколько ограничен (см. Ниже образец кода и данных).

Кто-нибудь знает о других сценариях - или, может быть, даже о пакете, - которые более развиты? Моя конечная цель - визуализировать как поток данных, так и проценты по относительному размеру компонентов диаграммы, как в этих примерах диаграмм Санки .

Я разместил несколько похожий вопрос в списке r-help , но после двух недель без каких-либо ответов я пытаюсь удачи здесь, в stackoverflow.

Спасибо, Эрик

PS. Я знаю график параллельных множеств , но это не то, что я ищу.

# thanks to, https://tonybreyal.wordpress.com/2011/11/24/source_https-sourcing-an-r-script-from-github/
  sourc.https     <- function(url, ...) {
# install and load the RCurl package 
if (match('RCurl', nomatch=0, installed.packages()[,1])==0) {
  install.packages(c("RCurl"), dependencies = TRUE)
  require(RCurl)  
} else require(RCurl)    

# parse and evaluate each .R script
  sapply(c(url, ...), function(u) {
    eval(parse(text = getURL(u, followlocation = TRUE, 
    cainfo  = system.file("CurlSSL", "cacert.pem", 
    package = "RCurl"))), envir = .GlobalEnv)
 } )
 }

# from https://gist.github.com/1423501
sourc.https("https://raw.github.com/gist/1423501/55b3c6f11e4918cb6264492528b1ad01c429e581/Sankey.R")

# My example (there is another example inside Sankey.R):
inputs = c(6, 144)
losses = c(6,47,14,7, 7, 35, 34)
unit = "n ="

labels = c("Transfers",
           "Referrals\n",
           "Unable to Engage",
           "Consultation only",
           "Did not complete the intake",
           "Did not engage in Treatment",
           "Discontinued Mid-Treatment",
           "Completed Treatment",
           "Active in \nTreatment")

SankeyR(inputs,losses,unit,labels)

# Clean up my mess
rm("inputs", "labels", "losses", "SankeyR", "sourc.https", "unit")

Диаграмма Санки, созданная с помощью приведенного выше кода, Диаграмма Санки, созданная с помощью приведенного выше кода

Эрик Фэйл
источник
2
Стрелки мне нравятся, похоже, вам осталось настроить текст, и вы в нем?
Роман Луштрик
@Roman Luštrik, я согласен, эта диаграмма совсем не плохая, но мои навыки R все еще ограничены, поэтому я не могу действительно так тонко настраивать R, если это было то, что вы имели в виду? Я, конечно, мог бы сделать это в Adobe Illustrator или чем-то подобном, но это нарушило бы принцип воспроизводимости исследования, который для меня является центральным элементом любой (академической) работы. Вы смотрели примеры, на которые я ссылался в посте ?
Эрик Фейл
Я понимаю, что мой вопрос не является хорошим вопросом в том смысле, что это не конкретная проблема программирования и не непосредственно практическая, а несколько открытый вопрос ( из FAQ ). Чтобы ответить на этот вопрос, нужно либо контролировать различные варианты построения графиков в R, и на этой основе ответить на мой вопрос отрицательным, более разработанных сценариев или пакетов не существует , либо нужно знать более развитый метод создания диаграмм Санки на языке R и указания на них. Может, есть место лучше, чтобы задать этот вопрос?
Эрик Фейл
1
Единственное место, которое я могу придумать, - это crossvalidated.com.
Роман Луштрик
Как насчет списка рассылки R-help? r-project.org/mail.html
Алекс Рейнольдс

Ответы:

63

Этот сюжет можно создать с помощью networkD3пакета. Он позволяет создавать интерактивные диаграммы Санки. Здесь вы можете найти пример . Я также добавил скриншот, чтобы вы поняли, как это выглядит.

# Load package
library(networkD3)

# Load energy projection data
# Load energy projection data
URL <- paste0(
        "https://cdn.rawgit.com/christophergandrud/networkD3/",
        "master/JSONdata/energy.json")
Energy <- jsonlite::fromJSON(URL)
# Plot
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             units = "TWh", fontSize = 12, nodeWidth = 30)

введите описание изображения здесь

Йонас Тундо
источник
4
пример ссылки не работает
rmstmppr 05
1
На самом деле. Лучшая альтернатива с момента появления htmlwidgets- это сюжет Санки из networkD3упаковки. Я обновил пост.
Йонас Тундо,
1
Можно ли использовать в заголовке числовые значения вместо целых? Значения взяты правильно, но заголовок кажется округленным. Например: значение = 0,8 и значение = 0,2 имеют разную ширину линии, но в заголовке указано «0» для обоих.
Naveen Mathew
Если вы попытаетесь воспроизвести это с помощью некоторого образца ваших собственных данных, убедитесь, что первый идентификатор источника начинается с 0, а идентификаторы источника и цели являются последовательными
Ричард
43

Я создал пакет ( речной график ), который имеет немного другую, но перекрывающуюся функциональность по сравнению с функцией Санки, и может создавать графики, подобные этому:

введите описание изображения здесь

Январь
источник
Это выглядит действительно впечатляюще! Я посмотрю на это как можно скорее.
Эрик Фэйл
39

Если вы хотите сделать это с помощью R, ваша лучшая ставка - это предложение @Roman - взломайте функцию SankeyR . Например - ниже мое очень быстрое исправление - просто ориентируйте метки вертикально, слегка смещайте их и уменьшайте шрифт для входных ссылок, чтобы он выглядел немного лучше. Эта модификация изменяет только строки 171 и 223 в функции SankeyR :

    #line171 - change oversized font size of input label
    fontsize = max(0.5,frInputs[j]*1.5)#1.5 instead of 2.5 

    #line223 - srt changes from 35 to 90 to orient labels vertically, 
    #and offset adjusts them to get better alignment with arrows
    text(txtX, txtY, fullLabel, cex=fontsize, pos=4, srt=90, offset=0.1)

введите описание изображения здесь

Я не ась в тригонометрии, но это действительно то, что вам нужно для изменения направления стрелок. На мой взгляд, это было бы идеально - если бы вы могли настроить стрелки потерь так, чтобы они были ориентированы горизонтально, а не вертикально. В противном случае, почему мое решение устраняет проблему с ориентацией меток, оно не делает диаграмму более читаемой ...

Компьютерщик на кислоте
источник
1
это хороший хак, спасибо. Я уже сделал это намного лучше. Я голосую за вас, и если ничего не получится, я буду счастлив передать вам награду, когда время истечет. Кроме того, мне нравится ваше имя пользователя.
Эрик Фейл
24

В дополнение к rCharts , Sankey диаграммы теперь могут быть также генерируется в R с googleVis (версия> = 0.5.0). Например, в этом посте описывается создание следующей диаграммы с помощью googleVis: введите описание изображения здесь

leo9r
источник
15

R package также сделает это (из ?alluvial).

# install.packages(c("alluvial"), dependencies = TRUE)
require(alluvial)

# Titanic data
tit <- as.data.frame(Titanic)

# 4d
alluvial( tit[,1:4], freq=tit$Freq, border=NA,
     hide = tit$Freq < quantile(tit$Freq, .50),
     col=ifelse( tit$Class == "3rd" & tit$Sex == "Male", "red", "gray") )

введите описание изображения здесь

геотеория
источник
6

Судя по этим определениям, этой функции, как и графику параллельных множеств, не хватает возможности разделять и комбинировать потоки (т.е. через более чем один переход).

Поскольку диаграммы Санки представляют собой ориентированные взвешенные графы , может оказаться полезным такой пакет, как qgraph .

SankeyRФункция обеспечивает более четкие метки при сортировке потери в порядке , как текст по убыванию помещается ближе к стрелам на без перекрытия.

РобинГауэр
источник
1
Сортировка убытков в порядке убывания нарушит направленность диаграммы. Если вы внимательно посмотрите на диаграмму, которую я представил, вы увидите, что время находится на оси x, следовательно, текущий порядок. Я знаю sankey-diagrams.com и статьи о нем. Когда я увидел этот веб-сайт, моей первой мыслью было открыть op R и создать красивую диаграмму Санки в ggplot2 .
Эрик Фейл
5

Взгляните на //sankeybuilder.com, поскольку он предлагает готовое решение, в котором вы можете загружать свои данные и воспроизводить варианты с течением времени. Переход работает хорошо (аналогично демонстрации youtube в вашем вопросе). Если вы загрузите демо SankeyTrend, оно включает в себя много временных интервалов (Годы данных). После загрузки (автоматически создает санки), нажмите кнопку воспроизведения в верхнем правом углу страницы для воспроизведения временных интервалов, вы даже можете приостановить и возобновить время. Демо-адрес находится здесь: SankeyTrend Надеюсь, это поможет вам в поисках идеальной диаграммы Sankey.

Роб
источник
4

Для полноты картины существует также ggalluvialпакет, предназначенный ggplot2 extensionдля диаграмм аллювиальных отложений / Санки.

Вот пример из документации пакета

# devtools::install_github("corybrunson/ggalluvial", ref = "optimization")
library(ggalluvial)

titanic_wide <- data.frame(Titanic)
ggplot(data = titanic_wide,
       aes(axis1 = Class, axis2 = Sex, axis3 = Age,
           y = Freq)) +
  scale_x_discrete(limits = c("Class", "Sex", "Age"), expand = c(.1, .05)) +
  xlab("Demographic") +
  geom_alluvium(aes(fill = Survived)) +
  geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) +
  theme_minimal() +
  ggtitle("passengers on the maiden voyage of the Titanic",
          "stratified by demographics and survival") +
  theme(legend.position = 'bottom')

ggplot(titanic_wide,
       aes(y = Freq,
           axis1 = Survived, axis2 = Sex, axis3 = Class)) +
  geom_alluvium(aes(fill = Class),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", label.strata = TRUE, reverse = FALSE) +
  scale_x_continuous(expand = c(0, 0), 
                     breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
  scale_y_discrete(expand = c(0, 0)) +
  coord_flip() +
  ggtitle("Titanic survival by class and sex")

Создано 13.11.2018 пакетом REPEX (v0.2.1.9000)

Тунг
источник
1

Просто откройте исходный код пакета, который использует аллювиальную диаграмму для визуализации этапов рабочего процесса. Поскольку при использовании наносной формы сохраняется история, пересечений по краям нет.

https://github.com/claytontstanley/shiny.alluvial

введите описание изображения здесь

Клейтон Стэнли
источник