2017-10-07 3 views
3

Ich habe eine Sankey-Plot erstellt in networkD3 Paket. Ich möchte die Farben und Transparenz beider Knoten und Links ändern.Ändern NetzwerkD3 Sankey Plot mit benutzerdefinierten Farben

Meine Daten networkD3_data wird am Ende angehängt.

Frage 1: Wie ändert man Knotenfarben mit einer benutzerdefinierten Palette?

Ich bin mir nicht sicher, wie Sie die Farben mit einer benutzerdefinierten Palette ändern. Es ist notwendig, dass ich dieselbe Farbpalette verwende, die für jede Knotenquelle spezifisch ist, um mit anderen Plots konsistent zu bleiben, die ich habe.

Derzeit kann ich jeden Quellknoten eine andere Farbe und alle Zielknoten die gleiche Farbe haben, indem Sie NodeGroup definieren. Das Diagramm unten ist nah dran, was ich will, aber jetzt möchte ich die Farbe jedes Quellknotens selbst bestimmen.

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 sagt ein colourScale Parameter ist die „Zeichenfolge Angabe die kategorische Farbskala für die Knoten“ annimmt. Ich nahm dies meine ich eine Spalte mit meiner gewünschten Farben an den networkD3_data$nodes Datenrahmen und rufen colourScale als solche hinzufügen:

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

Aber das funktioniert nicht, ist keine Handlung erzeugt. Ich suchte stackoverflow und fand eine Antwort von 2014: here, aber ich denke nicht, dass dies funktioniert nicht mehr, da ich einen Fehler Error: unexpected symbol Aufruf einer dieser vorgeschlagenen Lösungen (oder vielleicht weiß ich einfach nicht, wie dies richtig implementieren).

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

Frage 2: Ist es möglich, die Reihenfolge, in der die Quelle und Ziele angezeigt werden, zu definieren?

So dass Quellen von Source0 bis Source10 und Ziele von Target11 bis Target47 aufgeführt sind? Wo ist das Set? Ich weiß, dass dies kontraintuitiv ist, damit der Algorithmus die Knoten optimal positionieren kann.

Frage 3: Wie ändert man Linkfarben mit einer benutzerdefinierten Palette und ändert Transparenz/Deckkraft?

Ich möchte auch die Links von der Quelle farbcodieren, die das gleiche Farbschema wie die Quelle verwenden. Ich kann dies tun, indem ich LinkGroup definiere, siehe unten. Wieder bin ich nah dran, was ich will, aber ich muss nur die Farben angeben, die ich selbst benutze, und ich bin mir nicht sicher, wo ich das ändern soll. Ich möchte auch die Deckkraft so einstellen, dass die Quellfarbe fester ist als die Linkfarben.

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

Hier sind meine Daten - 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")) 

Antwort

2

Die Farbe pallete vom colourScale Argument bestimmt wird. Es sollte eine Zeichenfolge sein, die gültigen D3-Code enthält, um die Palette zu definieren.In der aktuellen Version von networkD3, die D3v4 + verwendet, ist die Syntax d3.scaleOrdinal().range(["#7d3945", "#e0677b", "#244457"]) gültig, obwohl sie auf d3.scaleOrdinal(["#7d3945", "#e0677b", "#244457"]) verkürzt werden könnte. Es gibt auch andere Möglichkeiten, see here. Die Anzahl der Farben in der Palette, die Sie auswählen/definieren, muss gleich oder größer als die Gesamtzahl der in Ihren Daten definierten eindeutigen Gruppen sein. Andernfalls wird die Schleife an den Anfang der Farbpalette zurückgeführt, um Farben weiteren Gruppen zuzuweisen. Die erste in Ihren Daten definierte Gruppe erhält die erste Farbe in Ihrer Farbpalette und so weiter.

Die NodeGroup und LinkGroup Parameter definieren den Namen der Spalte in Nodes und Links data.frames jeweils, die den Gruppenwert für jeden Knoten/Verknüpfung definieren. Sowohl die Knoten als auch die Links werden entsprechend ihrem Gruppenwert und der ihr zugewiesenen Farbe basierend auf der verwendeten Farbpalette farbig dargestellt.

Wenn Sie das iteration-Argument auf 0 setzen, wird die Ausführung des Platzierungsalgorithmus effektiv verhindert. Ihre Knoten werden so wie in den ursprünglichen Daten angeordnet. Wie Sie darauf hingewiesen haben, wird damit der Hauptzweck von sankeyNetwork im Wesentlichen zunichte gemacht.

die Daten verwenden Sie auf dem Laufenden ...

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) 

Transparenz/Opazität kann durch Einstellen RGBA Farben in der D3-Farbpalette erreicht werden, aber Sie werden das Dezimal-RGB-Notation (bis verwenden, müssen als Ich kann sagen). Sie möchten etwas wie #ff0043 in etwas wie d3.rgb(255,0,67,0.5) konvertieren, wobei die letzte Zahl eine Zahl zwischen 0 und 1 ist, die den Grad der Deckkraft definiert. Zum Beispiel ...

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

Vielen Dank! Ich verstehe jetzt, warum ich diesen Fehler bekommen habe: "Fehler: unerwartetes Symbol in" d3.scaleOrdinal(). Range "' wenn ich 'd3.scaleOrdinal(). Range ([" # 7d3945 "," # e0677b "," " # 244457 "])' oben, soll es in Anführungszeichen eingeschlossen sein '' d3.scaleOrdinal(). Range (["# 7d3945", "# e0677b", "# 244457"]) ''. Meine Follow-up Frage ist, ob wir die Links Farben unabhängig von den Farben der Knoten einrichten können? 'colourScale' sagt, dass es die Farbskala für die Knoten spezifiziert, aber es scheint, dass die Links die Farbe erben, wenn LinkGroup definiert ist, aber kann es unabhängig eingestellt werden? Oder kann die Transparenz verändert werden? – Djork

+0

Und die zweite Frage, gibt es eine Möglichkeit, die Reihenfolge der Quellknoten Source0-Source10 beizubehalten, aber den Algorithmus die Zielknoten optimal positionieren zu lassen? – Djork

+1

Transparenz ist hart in den JS codiert, also nein, nicht leicht. Sie können htmlwidget-Funktionen verwenden, um nach dem Laden zusätzliche JS-Dateien zu importieren, die alle Links auswählen und ihre Transparenz nach der ersten Generierung festlegen können. –

Verwandte Themen