Я пытаюсь визуализировать поток данных с помощью диаграммы Санки в 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")
Диаграмма Санки, созданная с помощью приведенного выше кода,
источник
Ответы:
Этот сюжет можно создать с помощью
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)
источник
htmlwidgets
- это сюжет Санки изnetworkD3
упаковки. Я обновил пост.Я создал пакет ( речной график ), который имеет немного другую, но перекрывающуюся функциональность по сравнению с функцией Санки, и может создавать графики, подобные этому:
источник
Если вы хотите сделать это с помощью 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)
Я не ась в тригонометрии, но это действительно то, что вам нужно для изменения направления стрелок. На мой взгляд, это было бы идеально - если бы вы могли настроить стрелки потерь так, чтобы они были ориентированы горизонтально, а не вертикально. В противном случае, почему мое решение устраняет проблему с ориентацией меток, оно не делает диаграмму более читаемой ...
источник
В дополнение к rCharts , Sankey диаграммы теперь могут быть также генерируется в R с googleVis (версия> = 0.5.0). Например, в этом посте описывается создание следующей диаграммы с помощью googleVis:
источник
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") )
источник
plotly имеет ту же мощность, что и
networkD3
package ( ссылка на пример ).источник
Судя по этим определениям, этой функции, как и графику параллельных множеств, не хватает возможности разделять и комбинировать потоки (т.е. через более чем один переход).
Поскольку диаграммы Санки представляют собой ориентированные взвешенные графы , может оказаться полезным такой пакет, как qgraph .
SankeyR
Функция обеспечивает более четкие метки при сортировке потери в порядке , как текст по убыванию помещается ближе к стрелам на без перекрытия.источник
Взгляните на //sankeybuilder.com, поскольку он предлагает готовое решение, в котором вы можете загружать свои данные и воспроизводить варианты с течением времени. Переход работает хорошо (аналогично демонстрации youtube в вашем вопросе). Если вы загрузите демо SankeyTrend, оно включает в себя много временных интервалов (Годы данных). После загрузки (автоматически создает санки), нажмите кнопку воспроизведения в верхнем правом углу страницы для воспроизведения временных интервалов, вы даже можете приостановить и возобновить время. Демо-адрес находится здесь: SankeyTrend Надеюсь, это поможет вам в поисках идеальной диаграммы Sankey.
источник
Для полноты картины существует также
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)
источник
Просто откройте исходный код пакета, который использует аллювиальную диаграмму для визуализации этапов рабочего процесса. Поскольку при использовании наносной формы сохраняется история, пересечений по краям нет.
https://github.com/claytontstanley/shiny.alluvial
источник