Пользовательские цвета для сети D3 sankeyGraph()
Важное уточнение: я использую более старую ветвь не-CRAN сети D3, разветвленную Флорианом Брейтвизером, https://github.com/fbreitwieser/networkD3/tree/add_zoom. Филиал Флориана добавил возможности масштабирования к графам Санки, но не был объединен с пакетом CRAN. Поскольку эта конкретная ветвь не обновлялась с 2016 года, синтаксис здесь отличается от того, который следует использовать с текущей (по состоянию на 2018-02-15) версией CRAN.
Я пытаюсь применить пользовательские цвета к networkD3
sankeyGraph()
,
Я пытаюсь воспроизвести пример № 1 из https://www.r-graph-gallery.com/322-custom-colours-in-sankey-diagram/.
Я предполагаю, что, возможно, с тех пор, как этот пример был опубликован, могло произойти обновление пакета или два, есть идеи о том, что может потребоваться изменить здесь?
(Почти дословно) код из примера
(Единственное изменение без форматирования, которое я сделал, это загрузить magrittr
прямо вместо того, чтобы нагромождать дюжину tidyverse
пакеты просто для трубы)
# Library
library(networkD3)
#library(tidyverse)
library(magrittr)
# Make a connection data frame
links=data.frame(source=c("group_A","group_A", "group_B", "group_C", "group_C", "group_E"),
target=c("group_C","group_D", "group_E", "group_F", "group_G", "group_H"),
value=c(2,3, 2, 3, 1, 3))
# From these flows we need to create a node data frame: it lists every entities involved in the flow
nodes=data.frame(name=c(as.character(links$source), as.character(links$target)) %>% unique())
links$IDsource=match(links$source, nodes$name)-1
links$IDtarget=match(links$target, nodes$name)-1
# prepare color scale: I give one specific color for each node.
my_color <- 'd3.scaleOrdinal() .domain(["group_A", "group_B","group_C", "group_D", "group_E", "group_F", "group_G", "group_H"]) .range(["blue", "blue" , "blue", "red", "red", "yellow", "purple", "purple"])'
# Make the Network. I call my colour scale with the colourScale argument
sankeyNetwork(Links = links,
Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
colourScale= my_color,
NodeID = "name")
Что должно было выйти:
Что я получаю:
Комментируя colourScale
показывает все остальное работает.
sankeyNetwork(Links = links,
Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
# colourScale= my_color,
NodeID = "name")
Некоторые вещи, которые я пробовал:
Казалось бы, многообещающий график вопросов и ответов для модификации networkD3 с помощью пользовательских цветов, но когда я запускаю то, что было помечено как принятый ответ, я снова получаю пустой вывод.
Как раскрасить группы в sankeyNetwork сети D3? также показался очень многообещающим, поскольку на него был получен ответ от автора пакета (@cjyetman), и хотя я смог воспроизвести его минимальный пример, мне не удалось добавить пользовательское сопоставление цветов.
Кажется, что собственная цветовая гамма для Sankey Diagram с пакетом networkD3 в R еще раз охватывала соответствующий синтаксис, но я снова вычеркнул, применив совет к этой проблеме.
1 ответ
Важное уточнение: я использую более старую ветвь не-CRAN сети D3, разветвленную Флорианом Брейтвизером, https://github.com/fbreitwieser/networkD3/tree/add_zoom. Филиал Флориана добавил возможности масштабирования к графам Санки, но не был объединен с пакетом CRAN. Поскольку эта конкретная ветвь не обновлялась с 2016 года, синтаксис здесь отличается от того, который следует использовать с текущей (по состоянию на 2018-02-15) версией CRAN.
Welp, наконец-то получил его на основе Sankey Diagram с библиотекой R сети D3 не показывает цвета
Правильный формат для этого использования выглядит следующим образом.
my_color <- 'd3.scale.category10().range(["blue", "blue" , "blue", "red", "red", "yellow", "purple", "purple"]).domain(["group_A", "group_B","group_C", "group_D", "group_E", "group_F", "group_G", "group_H"])'
Еще одна проблема, которую я наконец выяснил: имена групп в domain
не может быть пробелов!
Это будет работать:
'd3.scale.category10().range(["blue", "red"]).domain(["group_A", "group_B"])'
Это не будет!
'd3.scale.category10().range(["blue", "red"]).domain(["group A", "group B"])'