使用visNetwork根据边属性为边着色失败的问题排查
问题:visNetwork中按边属性着色失败,边颜色与节点一致
我尝试使用visNetwork包根据边的属性agreement_num为图中的边着色,但边始终与节点颜色一致,请问我哪里操作有误?
原代码
edges$color <- edges$agreement_num visNetwork(nodes, edges) %>% visEdges(arrows = 'from', smooth =T) %>% visOptions(selectedBy= "com") %>% visNodes(label = TRUE,scaling = list(label = list(min = 30, max = 50))) %>% visIgraphLayout(layout = "layout_nicely") %>%
可复现示例
nodes <- structure(list(id = c("United States of America", "Canada", "Mexico", "Peru", "Colombia", "Honduras", "Guatemala", "Nicaragua", "Nigeria", "Belize"), com = c("5", "5", "5", "5", "5", "5", "5", "5", "5", "5"), label = c("United States of America", "Canada", "Mexico", "Peru", "Colombia", "Honduras", "Guatemala", "Nicaragua", "Nigeria", "Belize"), font.size = c(30, 30, 30, 30, 30, 30, 30, 30, 30, 30), group = c("5", "5", "5", "5", "5", "5", "5", "5", "5", "5" )), row.names = c("United States of America", "Canada", "Mexico", "Peru", "Colombia", "Honduras", "Guatemala", "Nicaragua", "Nigeria", "Belize"), class = "data.frame") edges <- structure(list(from = c("Canada", "Canada", "United States of America", "Mexico", "United States of America", "Mexico", "United States of America", "Canada", "Mexico", "United States of America"), to = c("Antigua and Barbuda", "Barbados", "Barbados", "Belize", "Belize", "Canada", "Canada", "China, Taiwan Province of", "China, Taiwan Province of", "China, Taiwan Province of" ), weight = c(171966510.34557, 3894809879.52684, 190168793161.723, 229417909.693992, 56692662824.8982, 713710750.313289, 6240520849382.04, 286476683134.553, 928907970.889569, 14741754565243.3), agreement_num = c(1, 3, 45, 32, 2, 185L, NA, 3, 6, 45), value = c(171966510.34557, 3894809879.52684, 190168793161.723, 229417909.693992, 56692662824.8982, 713710750.313289, 6240520849382.04, 286476683134.553, 928907970.889569, 14741754565243.3)), row.names = c(NA, 10L), class = "data.frame")
错误原因
- 颜色值类型错误:直接将数值型的
agreement_num赋值给edges$color无效,visNetwork要求边的颜色是颜色字符串(如#FF0000、"red"),而非原始数值。 - NA值未处理:边数据中的
NA会导致着色逻辑异常,进而继承节点颜色。 - 默认颜色继承:节点的
group属性会让visNetwork默认给边分配与节点一致的颜色,需要明确覆盖这个行为。
修正后的代码
# 处理NA值,替换为0(可根据需求调整) edges$agreement_num[is.na(edges$agreement_num)] <- 0 # 创建颜色渐变映射:将agreement_num的数值映射到蓝-红渐变 color_palette <- colorRampPalette(c("blue", "red")) # 归一化agreement_num到0-1范围,再映射到颜色 norm_vals <- scales::rescale(edges$agreement_num, to = c(1, length(color_palette(100)))) edges$color <- color_palette(100)[round(norm_vals)] # 绘制网络图 visNetwork(nodes, edges) %>% visEdges(arrows = 'from', smooth = TRUE) %>% visOptions(selectedBy = "com") %>% visNodes(label = TRUE, scaling = list(label = list(min = 30, max = 50))) %>% visIgraphLayout(layout = "layout_nicely")
关键说明
- 用
colorRampPalette生成连续颜色渐变,适配agreement_num的数值范围,让不同数值对应不同颜色。 - 用
scales::rescale将原始数值归一化,确保颜色映射均匀。 - 提前处理NA值,避免着色逻辑出错。
- 直接给
edges$color赋值颜色字符串,明确覆盖visNetwork的默认颜色规则。
内容的提问来源于stack exchange,提问作者MoonS
相关产品推荐
相关产品推荐

