Rのサンキーダイアグラム?


86

Rのサンキーダイアグラムを使用してデータフローを視覚化しようとしています。

このブログ投稿は、サンキーダイアグラムを生成するRスクリプトにリンクしていることがわかりましたが、残念ながら、それはかなり生で、いくらか制限されています(サンプルコードとデータについては以下を参照してください)。

より開発された他のスクリプト、あるいはパッケージさえ知っている人はいますか?私の最終目標は、これらのSankey Diagramsの例のように、ダイアグラムコンポーネントの相対的なサイズによってデータフローとパーセンテージの両方を視覚化することです。

はr-helpリストやや似たような質問を投稿しましが、2週間何の応答もなかった後、ここで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
矢印は私にはうまく見えます、あなたはテキストを微調整することを余儀なくされているように見えます、そしてあなたは入っていますか?
ローマLuštrik

@RomanLuštrik、同意します。この図はまったく悪くありませんが、私のRスキルはまだ制限されているため、Rでそれほど微調整を行うことはできません。もちろん、Adobe Illustratorなどでそれを行うこともできますが、それは再現性のある研究の原則を破ることになります。これは、私にとってあらゆる(学術的)作業の中心的な要素です。投稿でリンクた例を見ましか?
エリックフェイル

私の質問は、特定のプログラミングの問題ではなく、直接実用的ではないという意味で良い質問ではなく、やや自由形式の質問です(FAQから)。この質問に答えるには、Rのさまざまなグラフ作成オプションを監視する必要があり、それに基づいて私の質問に「いいえ」で答える必要があります。より開発されたスクリプトやパッケージはありません。または、 Rでサンキーダイアグラムを作成し、それを指すためのより開発された方法。たぶん、この質問を投稿するためのより良い場所がありますか?
エリックフェイル

1
私が思いつくことができる唯一の場所は多分crossvalidated.comです。
ローマLuštrik

R-helpメーリングリストはどうですか?r-project.org/mail.html
Alex Reynolds

回答:


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 2016

1
確かに。の導入以来のより良い代替案htmlwidgetsは、networkD3パッケージからのサンキープロットです。投稿を更新しました。
Jonas Tundo 2016

1
整数の代わりに数値をキャプションとして使用することはできますか?値は正しく取得されますが、キャプションは四捨五入されているようです。例:value = 0.8とvalue = 0.2の線幅は異なりますが、キャプションには両方とも「0」と記載されています。
Naveen Mathew 2016

独自のデータのサンプルを使用してこれを再現しようとする場合は、最初のソースIDが0で始まり、ソースIDとターゲットIDが連続していることを確認してください
Richard

43

Sankey関数とは少し異なりますが機能が重複しているパッケージ(riverplot)を作成し、次のようなプロットを作成できます。

ここに画像の説明を入力してください


これは本当に印象的です!できるだけ早く見ていきます。
エリックフェイル

39

Rでそれをやりたいのなら、あなたの最良の入札は@Romanの提案のようです-SankeyR関数をハックしてください。たとえば、以下は私の非常に簡単な修正です。ラベルを垂直方向に向け、わずかにオフセットし、入力参照のフォントを減らして少し見栄えを良くします。この変更は、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)

ここに画像の説明を入力してください

私は三角法のエースではありませんが、これは本当に矢印の方向を変えるために必要なものです。それは私の見解では理想的です-緩い矢印を調整して、垂直方向ではなく水平方向に向けることができれば。そうでなければ、なぜ私の解決策がラベルの向きの問題を修正するのか、それは図をはるかに読みやすくしません...


1
それは素晴らしいハックです、ありがとう。私はすでにそれをはるかに良くしました。あなたは私の賛成票を持っています、そして何もうまくいかないなら、時間がなくなったときに私はあなたに賞金を転送してうれしいです。また、私はあなたのユーザー名が好きです。
エリックフェイル

24

rChartsに加えて、サンキーダイアグラムをgoogleVis(バージョン> = 0.5.0)を使用してRで生成できるようになりました。たとえば、この投稿では、googleVisを使用した次の図の生成について説明しています。 ここに画像の説明を入力してください


15

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

ここに画像の説明を入力してください



6

これらの定義から判断するとこの関数は、並列セットプロットのように、フローを分割および結合する機能がありません(つまり、複数の遷移を介して)。

以来サンキー図は重み付きグラフを向けられている、のようなパッケージqgraphは便利かもしれません。

SankeyRテキストが重ならないように矢印の頭の近くに配置されるため、損失を降順で並べ替えると、この関数はより明確なラベルを提供します。


1
損失を降順で並べ替えると、ダイアグラムの方向性が損なわれます。私が提出した図をよく見ると、時間がx軸上にあることがわかります。したがって、現在の順序です。私はsankey-diagrams.comとその記事を知っています。そのウェブサイトを見たときの私の最初の考えは、op Rを開いて、ggplot2で素敵なサンキーダイアグラムを作成することでした
エリックフェイル

5

で見て//sankeybuilder.comそれはあなたが時間をかけて自分のデータと再生のバリエーションをアップロードすることができソリューションを行くために準備ができていますよう。移行はうまく機能します(質問のYouTubeデモと同様)。SankeyTrendデモをロードすると、多くのタイムスロット(データの年数)が含まれます。ロードされたら(自動的にサンキーを作成します)、ページの右上隅にある再生ボタンをクリックしてタイムスロットを再生します。一時停止したり、時間を再開したりすることもできます。デモのURLはこちら:SankeyTrendこれが完璧なサンキーダイアグラムの探求に役立つことを願っています。


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

reprexパッケージ(v0.2.1.9000)によって2018-11-13に作成されました


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.