代码之家  ›  专栏  ›  技术社区  ›  CodeNoob

R网络3对角网络着色叶节点

  •  0
  • CodeNoob  · 技术社区  · 6 年前

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

    # 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 回复  |  直到 6 年前
        1
  •  2
  •   CodeNoob    6 年前

    经过一番费解之后,我发现我必须通过 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]; }'))