r package networkd3为R用户提供了一个在D3中制作网络图的接口,但是输入数据和将数据映射到网络审美的能力在可用图上有所不同(例如,SimpleNetwork,,,,simpleEnetwork,,forcenetwork(。
最近,我一直在尝试将自定义颜色应用于RadialNetwork((中的每个节点,类似于此线程,但是我不知道如何将自定义着色映射到节点。
生成自定义着色的代码:
library(networkD3)
library(tidyverse)
library(data.tree)
## Data
input <- list(number=50)
Data_tree <- data.frame(Start="Class",
Asset = sample(c("FI","Equity","Currency","Commodities"),input$number,replace = TRUE),
Sub_Asset = sample(c("Asia","Europe","USA","Africa","ME"),input$number,replace = TRUE),
Ticker = replicate(input$number,paste0(sample(LETTERS,3),collapse=""))) %>%
unite(col="pathString",Start,Asset,Sub_Asset,Ticker,sep="-",remove=FALSE) %>%
select(-Start) %>% as.Node(pathDelimiter = "-")
colorVector <- c("black", "red", "blue", "green", "orange",
rep("red", 5), rep("blue", 5), rep("green", 4), rep("orange", 4),
rep("red", 11), rep("blue", 14), rep("green", 14), rep("orange", 11))
jsarray <- paste0('["', paste(colorVector, collapse = '", "'), '"]')
nodeStrokeJS <- JS(paste0('function(d, i) { return ', jsarray, '[i]; }'))
radialNetwork(ToListExplicit(Data_tree, unname = TRUE ),
linkColour = "#ccc",
nodeColour = "#fff",
nodeStroke = nodeStrokeJS,
textColour = "#cccccc")
我会说这个示例有些不完整,因为它没有解释颜色是如何映射到节点的(是通过tolistexplicit或data_tree的列表输出列表吗?我找不到匹配的长度(,尤其是因为在ColorVector中添加其他元素不会破坏脚本。那么,如何在RadialNetwork((的输入数据中实现自定义颜色?
在您的示例中,节点是按级别排序的,然后是通过在原始数据中订购的方式。所以...
- 类(顶级(
- 权益(第二级(
- 货币(第二级(
- 商品(第二级(
- fi(第二级(
- 美国(第三级(
- 亚洲(第三级(
- 等。
如果您的调色板不足以匹配您的每个节点,则它将循环回到开始(就像当您组合不同长度的向量时R的方式一样,例如paste(c("node1","node2","node3"), c("d", "e"))
(
好吧,所以我通过发布该枪来跳了枪。一种解决方案是将data.tree转换为data.frame,然后构造一个与data.frame中的节点/行相对应的长度和顺序的向量方案(:
tree.df <- ToDataFrameNetwork(tree, "name")
colorVector <- rep("red", nrow(tree.df))
jsarray <- paste0('["', paste(colorVector, collapse = '", "'), '"]')
nodeStrokeJS <- JS(paste0('function(d, i) { return ', jsarray, '[i]; }'))
radialNetwork(ToListExplicit(Data_tree, unname = TRUE ),
linkColour = "#ccc",
nodeColour = "#fff",
nodeStroke = nodeStrokeJS,
textColour = "#cccccc")