как исправить неправильный цвет для узлов в networkD3 (sankeyNetwork)?

#r #d3.js #htmlwidgets #networkd3

Вопрос:

Привет и спасибо, что прочитали меня, я работаю с сюжетом Сэнки с пакетом networkD3 и пытаюсь настроить цвета для каждого узла, но получаю целую колонку «источник» с одним и тем же цветом, и я хочу получить разные цвета с определенной палитрой. Кто-нибудь знает, как я могу это исправить? Код, который я использую, следующий:

 library(networkD3)
data_long <-data.frame(
  stringsAsFactors = FALSE,
  source = c("Objetivo 1",
             "Objetivo 1","Objetivo 2","Objetivo 3",
             "Objetivo 4","Objetivo 1","Objetivo 2",
             "Objetivo 3","Objetivo 4",
             "Objetivo 1","Objetivo 2","Objetivo 3",
             "Objetivo 4","Objetivo 1",
             "Objetivo 2","Objetivo 3","Objetivo 4",
             "Objetivo 1","Objetivo 4",
             "Objetivo 4"),
  target = c("ODS 12: Producción y consumo responsables",
             "ODS 17: Alianzas para lograr los objetivos",
             "ODS 10: Reducción de las desigualdades",
             "ODS 10: Reducción de las desigualdades",
             "ODS 17: Alianzas para lograr los objetivos","ODS 3: Salud y bienestar",
             "ODS 12: Producción y consumo responsables",
             "ODS 12: Producción y consumo responsables",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 5: Igualdad de género",
             "ODS 10: Reducción de las desigualdades",
             "ODS 12: Producción y consumo responsables"),
  value = c(2L,1L,3L,1L,2L,1L,
            3L,1L,1L,19L,1L,11L,13L,15L,
            8L,4L,4L,1L,1L,1L)
)


my_color <- 'd3.scaleOrdinal() .domain(["Objetivo 1", "Objetivo 2","Objetivo 3", "Objetivo 4","ODS 3: Salud y bienestar", "ODS 5: Igualdad de género", "ODS 9: Industria, innovación e infraestructura", "ODS 10: Reducción de las desigualdades", "ODS 12: Producción y consumo responsables", "ODS 17: Alianzas para lograr los objetivos"]) 
.range(["#12A09A", "#1E5C4F" , "#941B80", "#F19100", "#4C9F38", "#FF3A21", "#FD6925", "#DD1367", "#BF8B2E", "purple", "#001B8C"])'

nodes <- data.frame(name=c(as.character(data_long$source), as.character(data_long$target)) %>% unique())


data_long$IDsource=match(data_long$source, nodes$name)-1 
data_long$IDtarget=match(data_long$target, nodes$name)-1

sankeyNetwork(Links = data_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", 
              sinksRight=FALSE, colourScale=my_color, 
              nodeWidth=40, fontSize=13, nodePadding=20)
 

Ответ №1:

Группа узлов определяется именем узла, если оно не указано явно, и в имени группы узлов не может быть пробелов.

Вы можете добавить столбец группы узлов в свой фрейм данных узлов следующим образом

 nodes$node_group <- gsub(" ", "_", nodes$name)
 

а затем укажите этот столбец в качестве группы узлов с sankeyNetwork() аргументом NodeGroup = "node_group"

все вместе…

 library(networkD3)
library(dplyr)

data_long <-data.frame(
  stringsAsFactors = FALSE,
  source = c("Objetivo 1",
             "Objetivo 1","Objetivo 2","Objetivo 3",
             "Objetivo 4","Objetivo 1","Objetivo 2",
             "Objetivo 3","Objetivo 4",
             "Objetivo 1","Objetivo 2","Objetivo 3",
             "Objetivo 4","Objetivo 1",
             "Objetivo 2","Objetivo 3","Objetivo 4",
             "Objetivo 1","Objetivo 4",
             "Objetivo 4"),
  target = c("ODS 12: Producción y consumo responsables",
             "ODS 17: Alianzas para lograr los objetivos",
             "ODS 10: Reducción de las desigualdades",
             "ODS 10: Reducción de las desigualdades",
             "ODS 17: Alianzas para lograr los objetivos","ODS 3: Salud y bienestar",
             "ODS 12: Producción y consumo responsables",
             "ODS 12: Producción y consumo responsables",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 8: Trabajo decente y crecimiento económico",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 9: Industria, innovación e infraestructura",
             "ODS 5: Igualdad de género",
             "ODS 10: Reducción de las desigualdades",
             "ODS 12: Producción y consumo responsables"),
  value = c(2L,1L,3L,1L,2L,1L,
            3L,1L,1L,19L,1L,11L,13L,15L,
            8L,4L,4L,1L,1L,1L)
)


my_color <- 'd3.scaleOrdinal().domain(["Objetivo 1", "Objetivo 2","Objetivo 3", "Objetivo 4","ODS 3: Salud y bienestar", "ODS 5: Igualdad de género", "ODS 9: Industria, innovación e infraestructura", "ODS 10: Reducción de las desigualdades", "ODS 12: Producción y consumo responsables", "ODS 17: Alianzas para lograr los objetivos"]) 
.range(["#12A09A", "#1E5C4F" , "#941B80", "#F19100", "#4C9F38", "#FF3A21", "#FD6925", "#DD1367", "#BF8B2E", "purple", "#001B8C"])'

nodes <- data.frame(name=c(as.character(data_long$source), as.character(data_long$target)) %>% unique())


data_long$IDsource=match(data_long$source, nodes$name)-1 
data_long$IDtarget=match(data_long$target, nodes$name)-1

nodes$node_group <- gsub(" ", "_", nodes$name)


sankeyNetwork(Links = data_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", NodeGroup = "node_group",
              sinksRight=FALSE, colourScale=my_color, 
              nodeWidth=40, fontSize=13, nodePadding=20)
 

введите описание изображения здесь