Sankey Diagrams in R?

我试图用R中的Sankey图来显示我的数据stream。

我发现这个博客文章链接到一个R脚本,生成一个Sankey图,不幸的是它是相当原始的,有些有限(见下面的示例代码和数据)。

有没有人知道其他脚本 – 或者甚至是一个包 – 这是更发达? 我的最终目标是通过图组件的相对大小来可视化数据stream和百分比,就像这些Sankey图的例子 。

我在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") 

用上面的代码制作的Sankey图, 用上面的代码生成的Sankey图

这个图可以通过networkD3包创build。 它允许您创build交互式的sankey图表。 在这里你可以find一个例子 。 我还添加了一个截图,让你知道它的样子。

在这里输入图像描述

如果你想用R来做,你的最好的出价似乎是@罗曼的build议 – 破解SankeyR函数。 例如 – 下面是我很快的修复 – 简单地定位标签verticaly,slighlty抵消他们和减lessinputreferals的字体,使其看起来好一点。 这个修改只改变了SankeyR函数中的第171行和第223行:

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

在这里输入图像描述

我不是三angular学中的王牌,但这实际上是你需要改变箭头的方向。 这在我看来是理想的 – 如果你可以调整松散的箭头,所以他们是水平的,而不是垂直的。 否则,为什么我的解决scheme解决了标签方向的问题,它不会使图更加可读…

我创build了一个与Sankey函数相比略有不同但function重叠的包( riverplot ),并且可以生成如下这样的地块:

在这里输入图像描述

除了rCharts之外 , Sankey图现在也可以通过googleVis (version> = 0.5.0)在R中生成。 例如,本文描述了使用googleVis生成以下图表: 在这里输入图像描述

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

在这里输入图像描述

通过这些定义来判断,这个函数,比如Parallel Sets Plot,没有能力分stream和合并stream(即通过一个以上的转换)。

由于Sankey图是有向图 ,所以像qgraph这样的包可能会有用。

SankeyRfunction提供更清晰的标签,如果您按降序排列损失,因为文本放置在靠近箭头的位置,而没有重叠。

积极地具有与networkD3包( 例子链接 )相同的力量。

在这里输入图像描述

看看//sankeybuilder.com,因为它提供了一个随时随地的解决scheme,您可以随时随地上传数据和播放变化。 过渡效果很好(类似于你的问题中的youtube演示)。 如果您加载SankeyTrend演示,它包含许多时间段(数据年数)。 一旦加载(自动构buildsankeys),单击页面右上angular的播放button可以播放时间段,甚至可以暂停和恢复时间。 演示url在这里: SankeyTrend希望这有助于你寻求完美的Sankey图。

只需打开一个包,使用冲积图来显示工作stream程阶段。 由于在使用冲积形态的时候保存了历史,因此边缘没有交叉。

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

在这里输入图像描述