2017-10-07 14 views
3

networkD3パッケージで作成されたサニーキープロットがあります。私は両方のノードとリンクの色と透明度を変更したいと思います。ユーザー定義の色でnetworkD3 sankeyプロットを変更します。

私のデータnetworkD3_dataが末尾に追加されます。

質問1:ユーザー定義のパレットでノードの色を変更するにはどうすればよいですか?

ユーザー定義のパレットで色を変更する方法がわかりません。私が持っている他のプロットとの一貫性を保つために、各ノードソースに固有の同じカラーパレットを使用する必要があります。

現在、NodeGroupを定義することによって、各ソースノードを異なる色にし、すべてのターゲットノードを同じ色にすることができます。以下のプロットは私が望むものに近いですが、今は自分で各ソースノードの色を指定したいと思います。

library(networkD3) 
sankeyNetwork(Links = networkD3_data$links, Nodes = networkD3_data$nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", NodeGroup="group", fontSize=14) 

enter image description here

?sankeyNetwork「ノードのためのカテゴリカル色スケールを指定する文字列」を取るcolourScaleパラメータがあると言います。私は、私のようなcolourScalenetworkD3_data$nodesデータフレームに私の希望の色でカラムを追加して呼び出すことができますを意味し、これを取った:

sankeyNetwork(Links = networkD3_data$links, Nodes = networkD3_data$nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", NodeGroup="group", fontSize=14, colourScale="colors") 

しかし、これは、何のプロットが生成されていない動作しません。私はstackoverflowを検索し、2014:hereから答えを見つけましたが、私はエラーError: unexpected symbolこれらの提案されたソリューションのいずれかを呼び出す(またはおそらく私はちょうどこれを適切に実装する方法がわからない)ので、これはもう動作しないと思います。

d3.scale.ordinal().range(["#7d3945","#e0677b", "#244457"]) 
d3.scaleOrdinal().range(["#7d3945","#e0677b", "#244457"]) 

質問2:それはソースとターゲットが表示される順番を定義することは可能ですか?

ソースはSource0からSource10まで、TargetはTarget11からTarget47までリストされていますか?このセットはどこですか?アルゴリズムがノードを最適に配置できるようにすることは、直感的ではないことが分かります。

質問3:ユーザー定義のパレットでリンクの色を変更し、透明/不透明度を変更するにはどうすればよいですか?

また、ソースと同じ配色を使用して、ソースから出てくるリンクを色分けしたいと思います。私はLinkGroupを定義することでこれを行うことができます。以下のプロットを参照してください。再び私は私が望むものに近づいていますが、自分で使用する色を指定する必要があります。これを変更する場所がわかりません。また、ソースカラーがリンクカラーよりも強固になるように、不透明度を調整したい。ここで

sankeyNetwork(Links = networkD3_data$links, Nodes = networkD3_data$nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", NodeGroup="group", LinkGroup="group", fontSize=14) 

enter image description here

私のデータである - dput(networkD3_data)

structure(list(nodes = structure(list(name = c("Source0", "Source1", 
"Source2", "Source3", "Source4", "Source5", "Source6", "Source7", 
"Source8", "Source9", "Source10", "Target11", "Target12", "Target13", 
"Target14", "Target15", "Target16", "Target17", "Target18", "Target19", 
"Target20", "Target21", "Target22", "Target23", "Target24", "Target25", 
"Target26", "Target27", "Target28", "Target29", "Target30", "Target31", 
"Target32", "Target33", "Target34", "Target35", "Target36", "Target37", 
"Target38", "Target39", "Target40", "Target41", "Target42", "Target43", 
"Target44", "Target45", "Target46", "Target47"), group = c("Source0", 
"Source1", "Source2", "Source3", "Source4", "Source5", "Source6", 
"Source7", "Source8", "Source9", "Source10", "Target", "Target", 
"Target", "Target", "Target", "Target", "Target", "Target", "Target", 
"Target", "Target", "Target", "Target", "Target", "Target", "Target", 
"Target", "Target", "Target", "Target", "Target", "Target", "Target", 
"Target", "Target", "Target", "Target", "Target", "Target", "Target", 
"Target", "Target", "Target", "Target", "Target", "Target", "Target" 
), colors = c("#9E0142", "#D53E4F", "#F46D43", "#FDAE61", "#FEE08B", 
"#FFFFBF", "#E6F598", "#ABDDA4", "#66C2A5", "#3288BD", "#5E4FA2", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696", "#969696", "#969696", "#969696", "#969696", "#969696", 
"#969696")), .Names = c("name", "group", "colors"), row.names = c(NA, 
-48L), class = "data.frame"), links = structure(list(source = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 
6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10 
), target = c(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 
23, 13, 18, 15, 11, 12, 24, 21, 25, 26, 27, 19, 28, 16, 22, 29, 
30, 31, 32, 18, 16, 15, 13, 27, 29, 19, 33, 34, 31, 35, 21, 24, 
11, 30, 36, 28, 37, 38, 39, 40, 26, 41, 11, 12, 15, 18, 19, 14, 
13, 16, 27, 34, 20, 22, 25, 12, 27, 16, 18, 13, 11, 12, 11, 14, 
27, 21, 16, 18, 22, 13, 15, 19, 16, 11, 12, 39, 12, 14, 18, 11, 
42, 43, 44, 13, 11, 18, 15, 12, 19, 45, 31, 16, 20, 46, 40, 47, 
11, 12, 18, 16, 14, 19, 15, 11, 12, 16, 13, 18, 14, 34, 31, 15 
), value = c(5.8, 3.2, 5, 2.4, 2.5, 2.7, 3.5, 2.5, 3.5, 1.4, 
2.9, 2.4, 1.3, 12.1, 7.4, 5, 11.2, 5.6, 6.4, 8.8, 2.6, 3.5, 7, 
10, 4.5, 6, 6.5, 5.8, 5.4, 6.2, 8.9, 5.5, 4.8, 3.4, 6.5, 5, 4, 
6.4, 7.3, 4.4, 4.2, 1.7, 5.1, 3.6, 6.4, 3.4, 2.5, 2.6, 2.3, 2.3, 
3.2, 1.6, 1.7, 3.7, 8, 4.4, 3.1, 4.1, 5.9, 2.8, 5, 3.2, 3.7, 
3.4, 1.8, 3.2, 1.2, 4.1, 5.2, 4.5, 4.8, 7.1, 7.3, 4.6, 8.4, 3.4, 
5.2, 6.1, 4.3, 4.5, 4.5, 6.5, 2.8, 6.3, 5.3, 8.2, 3.8, 4.3, 4.2, 
3.4, 5.4, 7.9, 1.2, 1.4, 1.4, 6.6, 6.8, 4.2, 2.9, 3.1, 5.3, 2.6, 
3.2, 2.9, 1.7, 1.9, 1.4, 8, 8, 4, 5, 4.3, 2.9, 6.9, 3, 8.7, 4.5, 
4.2, 6.6, 4.4, 2.7, 4.4, 4.3, 2.8), group = c("Source0", "Source0", 
"Source0", "Source0", "Source0", "Source0", "Source0", "Source0", 
"Source0", "Source0", "Source0", "Source0", "Source0", "Source1", 
"Source1", "Source1", "Source1", "Source1", "Source1", "Source1", 
"Source1", "Source1", "Source1", "Source1", "Source1", "Source1", 
"Source1", "Source1", "Source1", "Source1", "Source1", "Source2", 
"Source2", "Source2", "Source2", "Source2", "Source2", "Source2", 
"Source2", "Source2", "Source2", "Source2", "Source2", "Source2", 
"Source2", "Source2", "Source2", "Source2", "Source2", "Source2", 
"Source2", "Source2", "Source2", "Source2", "Source3", "Source3", 
"Source3", "Source3", "Source3", "Source3", "Source3", "Source3", 
"Source3", "Source3", "Source3", "Source3", "Source3", "Source4", 
"Source4", "Source4", "Source4", "Source4", "Source4", "Source5", 
"Source5", "Source5", "Source5", "Source5", "Source5", "Source5", 
"Source5", "Source5", "Source5", "Source5", "Source6", "Source6", 
"Source6", "Source6", "Source7", "Source7", "Source7", "Source7", 
"Source7", "Source7", "Source7", "Source8", "Source8", "Source8", 
"Source8", "Source8", "Source8", "Source8", "Source8", "Source8", 
"Source8", "Source8", "Source8", "Source9", "Source9", "Source9", 
"Source9", "Source9", "Source9", "Source9", "Source9", "Source10", 
"Source10", "Source10", "Source10", "Source10", "Source10", "Source10", 
"Source10", "Source10")), .Names = c("source", "target", "value", 
"group"), row.names = c(NA, -124L), class = "data.frame")), .Names = c("nodes", 
"links")) 

答えて

2

カラーパレットがcolourScale引数によって決定されます。これは、パレットを定義するための有効なD3コードを含む文字列でなければなりません。D3v4 +を使用するnetworkD3の現在のバージョンでは、d3.scaleOrdinal(["#7d3945", "#e0677b", "#244457"])に短縮することができますが、d3.scaleOrdinal().range(["#7d3945", "#e0677b", "#244457"])の構文は有効です。他の可能性もあります。see here。選択または選択したパレットの色数は、データに定義されている一意のグループの総数以上でなければなりません。そうでない場合は、カラーパレットの先頭にループバックして、グループに色を割り当てます。データに定義されている最初のグループには、カラーパレットの最初の色が割り当てられます。

NodeGroupLinkGroupパラメータは、各ノード/リンクのグループ値を定義する、それぞれ、自分のNodesLinks data.framesの列の名前を定義します。ノードとリンクの両方は、使用されているカラーパレットに基づいて、グループ値と割り当てられたカラーに従って色付けされます。

iteration引数を0に設定すると、配置アルゴリズムが実行されないため、ノードは元のデータと同じ順序で並べられます。あなたが指摘したように、これは本質的にsankeyNetworkの主な目的を破っています。あなたがポストされたデータを使用して

...

library(networkD3) 

colors <- paste(networkD3_data$nodes$colors, collapse = '", "') 
colorJS <- paste('d3.scaleOrdinal(["', colors, '"])') 

sankeyNetwork(Links = networkD3_data$links, Nodes = networkD3_data$nodes, 
       Source = 'source', Target = 'target', Value = 'value', 
       NodeID = 'name', NodeGroup = "group", LinkGroup = "group", 
       colourScale = colorJS, 
       iterations = 0) 

透明/不透明度はD3のカラーパレットにRGBA色を設定することによって達成することができますが、あなたは限り(十進RGB表記を使用する必要があります私が言うことができる)。 #ff0043のようなものをd3.rgb(255,0,67,0.5)のようなものに変換する必要があります。最後の数字は、不透明度のレベルを定義する0〜1の数字です。たとえば...

colors <- paste(sapply(networkD3_data$nodes$colors, function(x) { paste0("d3.rgb(", paste(c(col2rgb(x), 0.5), collapse = ","), ")") }), collapse = ", ") 
colorJS <- paste0('d3.scaleOrdinal([', colors, '])') 
sankeyNetwork(Links = networkD3_data$links, Nodes = networkD3_data$nodes, 
       Source = 'source', Target = 'target', Value = 'value', 
       NodeID = 'name', NodeGroup = "group", LinkGroup = "group", 
       colourScale = colorJS, 
       iterations = 0) 
+0

ありがとうございます!なぜ私はこのエラーが発生したのか理解しています: 'd3.scaleOrdinal()。range("#7d3945 "、"#e0677b "、" #244457 "))' ')' d3.scaleOrdinal()。range( ""#7d3945 "、"#e0677b "、"#244457 ") ''のように囲まれているはずです。私の追随する質問は、リンクの色をノードの色とは独立して設定できるかどうかです。 'colourScale'はノードのカラースケールを指定していますが、LinkGroupが定義されているときにリンクが継承しているように見えますが、透明性を変えることはできますか? – Djork

+0

2番目の質問は、ソースノードSource0-Source10の順序を維持する方法ですが、アルゴリズムでターゲットノードを最適に配置できるようにしますか? – Djork

+1

透明度はJSにハードコードされているため、簡単ではありません。 htmlwidget関数を使用して読み込み後にJSを追加して、すべてのリンクを選択し、最初に生成された後に透明度を設定することができます。 –

関連する問題