2012-04-01 89 views
71

我試圖想象我有一個熱平衡圖數據流R.R的Sankey圖?

我發現this blog post鏈接到產生熱平衡圖的R腳本,不幸的是它是相當原始和比較有限(見下面的示例代碼和數據)。

有沒有人知道其他腳本 - 或者甚至是一個包 - 更發達?我的最終目標是通過圖組件的相對大小顯示數據流和百分比,如these examples of Sankey Diagrams

我貼a somewhat similar question on the r-help list,但兩週後沒有任何反應,我想我的運氣在這裏在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

+2

箭頭看起來沒什麼問題,看起來像你留下了微調的文字和你的? – 2012-04-03 08:09:54

+0

@羅曼Luštrik,我同意,這個圖並不差,但我的R技能仍然有限,所以我不能在R中做那麼多的微調,如果那是你的意思?我當然可以用Adobe Illustrator或類似的軟件來做,但這會違反可重複研究的原則,這對我來說是任何(學術)工作的核心要素。你看過[我在帖子中鏈接到的例子](http://www.sankey-diagrams.com/tag/software/)嗎? – 2012-04-03 17:52:13

+0

我意識到我的問題不是一個好問題,它不是一個特定的編程問題,也不是直接實用的問題,而是一個有些開放式問題(來自FAQ)(http://stackoverflow.com/faq) )。要回答這個問題,人們必須對R中不同的圖形選項進行監督,並在此基礎上用_no來回答我的問題,那裏沒有任何更開發的代碼或包,或者需要知道在R中生成Sankey Diagrams並指向它的更爲成熟的方法。也許有更好的地方發佈這個問題? – 2012-04-03 18:01:47

回答

6

通過these definitions此功能來看,如並行集劇情,缺乏分裂的能力和組合流(即通過一個以上的過渡)。

由於Sankey diagrams are directed weighted graphs,像qgraph這樣的軟件包可能會有用。

SankeyR函數提供更清晰的標籤,如果您按降序排列損失,因爲文本放置在靠近箭頭且沒有重疊的位置。

+0

按降序對虧損進行排序會破壞圖表的方向質量。如果仔細觀察我提交的圖表,您會看到_time_在x軸上,因此是當前訂單。我意識到[sankey-diagrams.com](http://www.sankey-diagrams.com/)及其上的文章,當我看到該網站打開op R併產生一個不錯的Sankey [ggplot2]中的圖表(http://had.co.nz/ggplot2/)。 – 2012-04-04 01:52:58

36

如果你想用R做,你的最好的出價似乎是@羅曼的建議 - 破解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

我在三角沒有王牌,但是這確實是你所需要的改變箭頭的方向。在我看來,這是理想的 - 如果你可以調整鬆動箭頭,使它們水平定向而不是垂直定向。否則,爲什麼我的解決方案解決了標籤方向的問題,它不會使圖表更加可讀...

+1

這是一個很好的黑客,謝謝。我已經做得更好了。你有我的投票權,如果沒有更好的辦法,我很樂意在時間用完時把獎金轉移給你。另外,我喜歡你的用戶名。 – 2012-04-05 06:14:59

34

我創建了一個包(riverplot),它與Sankey具有稍微不同但重疊的功能功能,並能產生曲線像這樣的:

enter image description here

+0

這看起來真令人印象深刻!我會盡快查看它。 – 2014-03-07 10:07:38

47

此圖可通過networkD3包中創建。它允許您創建交互式sankey圖表。在這裏你可以找到example。我還添加了一個截圖,以便您瞭解它的外觀。

enter image description here

+2

示例鏈接中斷 – Nelson 2016-08-05 17:51:36

+1

確實。自推出'htmlwidgets'以來,更好的選擇是來自'networkD3'包的sankey圖。我更新了這篇文章。 – JT85 2016-08-09 21:08:46

+1

是否可以將數值作爲標題而不是整數?值正確,但標題似乎四捨五入。例如:value = 0.8和value = 0.2具有不同的行寬,但標題說明兩者均爲「0」。 – 2016-09-01 09:22:27

20

除了rCharts桑基示現在可以在R上也產生與googleVis(版本> = 0.5.0)。例如,這post描述了使用googleVis如下圖的生成: enter image description here

5

看看//sankeybuilder.com,因爲它提供了一個蓄勢待發的解決方案,您可以上傳您的數據和播放隨時間的變化。過渡效果很好(類似於你的問題中的youtube演示)。如果您加載SankeyTrend演示,它包含許多時間段(數據年數)。一旦加載(自動構建sankeys),單擊頁面右上角的播放按鈕以播放時間段,甚至可以暫停和恢復時間。演示網址如下:SankeyTrend希望這有助於您尋求完美的Sankey圖。

9

R的包也將這樣做(從?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")) 

enter image description here