R networkD3对角线网络着色叶节点

时间:2018-09-25 16:09:30

标签: r networking networkd3

问题描述
我有一个将被聚类的数据框和一个定义节点颜色的数据框,如下所示:

# DATA
color.df <- data.frame(
  name = c('node1',"node2","node3"),
  color = c('green','red','blue')
)

data.df <- t(data.frame(
  node1 = c(1,2,3,5),
  node2 = c(4,5,3,5),
  node3 = c(3,3,2,1)
))

然后我应用分层聚类并将其转换为径向网络:

# CLUSTERING
distance.mat <- dist(data.df)
hc <- hclust(distance.mat)
rad <- as.radialNetwork(hc, '')
diagonalNetwork(List = rad)

现在我想根据color.df为节点着色,当所有节点颜色都已知(如回答here)时,这是可行的,但是这变得更加困难,因为只有叶子需要着色(显然,我的网络比这个示例要复杂得多。

我尝试过的事情
我认为方法是使用JS这样将节点名称映射为颜色:

function test(d, i)  { return { "node1" : "green", "node2" : "red", "node3" : "blue" }[d] }
test("node1")

我试图在R中实现这一点

w <- paste('{', paste(color.df %>% 
                        mutate(name = paste0('"', name), color = paste0(color, '"')) %>%
                        unite('x', c(name, color), sep = '" : "' ) %>%
                        .$x, collapse= ', '), '}', collapse = '') 

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.name]; }'))
rad <- as.radialNetwork(hc, '')
dn <- diagonalNetwork(List = rad, nodeColour = node.col.func)

这不起作用,但是代码本身起作用,因为我对其进行了硬编码,从而使节点着色:

node.col.func <- JS(paste0('function(d, i) { return ', w, '["node1"]; }'))

如果我使用警报d.name将返回'undefined',因此显然我无法在此处访问节点名称。

1 个答案:

答案 0 :(得分:1)

经过一番困惑后,我发现我必须通过d.data.name而不是d.name访问节点名称。 所以这行:

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.name]; }'))

应替换为:

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.data.name]; }'))