radialNetwork()的R networkD3自定义节点颜色
R networkD3 custom node color for radialNetwork()
R 包 networkD3 为 R 用户提供了在 D3 中绘制网络图的界面,但输入数据和将数据映射到网络美学的能力因可用图(例如 simpleNetwork、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() 的输入数据中实现的呢?
在您的示例中,节点按级别排序,然后按它们在原始数据中的排序方式排序。所以...
- Class(顶级)
- 股权(二级)
- 货币(二级)
- 商品(二级)
- FI(二级)
- 美国(第 3 级)
- 亚洲(第 3 级)
- 等等
如果您的调色板不够长以匹配您的每个节点,那么它将循环回到开头(很像 R 在组合不同长度的向量时的做法,例如 paste(c("node1","node2","node3"), c("d", "e"))
)
好的,所以我发布得太早了。一种解决方案是将 data.tree 转换为 data.frame,然后构造一个长度和阶数对应于 data.frame 中的 nodes/rows 的向量(因为 data.frame 产生一个 to/from/name 列方案):
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")
R 包 networkD3 为 R 用户提供了在 D3 中绘制网络图的界面,但输入数据和将数据映射到网络美学的能力因可用图(例如 simpleNetwork、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() 的输入数据中实现的呢?
在您的示例中,节点按级别排序,然后按它们在原始数据中的排序方式排序。所以...
- Class(顶级)
- 股权(二级)
- 货币(二级)
- 商品(二级)
- FI(二级)
- 美国(第 3 级)
- 亚洲(第 3 级)
- 等等
如果您的调色板不够长以匹配您的每个节点,那么它将循环回到开头(很像 R 在组合不同长度的向量时的做法,例如 paste(c("node1","node2","node3"), c("d", "e"))
)
好的,所以我发布得太早了。一种解决方案是将 data.tree 转换为 data.frame,然后构造一个长度和阶数对应于 data.frame 中的 nodes/rows 的向量(因为 data.frame 产生一个 to/from/name 列方案):
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")