如何修复networkD3中sankeyNetwork桑基图的节点颜色错误问题
问题修复方案
你遇到的节点同色问题由两个核心错误导致:
- 你定义的d3颜色比例尺
domain参数中,遗漏了数据实际包含的节点ODS 8: Trabajo decente y crecimiento económico,色阶无法匹配所有节点时就会出现异常同色 - 你设置的
domain节点总数为10个,但range提供了11个颜色值,映射关系数量不匹配也会触发渲染异常
以下是修复后的完整可运行代码:
library(networkD3) library(magrittr) 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) ) # 修正颜色比例尺:补全遗漏的ODS8节点,调整颜色数量和节点数一一对应 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 8: Trabajo decente y crecimiento económico", "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", "#2E7D32", "#FD6925", "#DD1367", "#BF8B2E", "purple"])' 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)
上述代码中新增的ODS8节点对应颜色为#2E7D32,你可以根据需求自行调整该色值,只要保证domain里的节点名称和数据中的完全一致、domain和range的元素数量一一对应即可正常渲染自定义节点颜色。
内容的提问来源于stack exchange,提问作者Jorge Hernández
相关产品推荐
相关产品推荐

