Подтвердить что ты не робот

Схемы Санки в R?

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

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

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

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

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

PS. Я знаю Parallel Sets Plot, но это не то, что я ищу.

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

Диаграмма Санки, созданная с помощью приведенного выше кода, Sankey Diagram produced with the code above

4b9b3361

Ответ 1

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

enter image description here

Ответ 2

Если вы хотите сделать это с помощью 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)

enter image description here

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

Ответ 3

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

enter image description here

Ответ 4

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

Ответ 5

R аллювиальный пакет также сделает это.

alluvial( as.data.frame(Titanic)[,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

Судя по этим определениям эта функция, как и Parallel Sets Plot, не обладает способностью разбивать и комбинировать потоки (т.е. через более чем один переход).

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

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

Ответ 8

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

Ответ 9

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

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

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