R networkD3包:simpleNetwork()中的节点着色

war*_*hip 10 javascript r networkd3 htmlwidgets

networkD3包(见这里这里)允许用户创建简单的互动网络:

# Load package
library(networkD3)

# Create fake data
src <- c("A", "A", "A", "A",
        "B", "B", "C", "C", "D")
target <- c("B", "C", "D", "J",
            "E", "F", "G", "H", "I")
networkData <- data.frame(src, target)

# Plot
simpleNetwork(networkData)
Run Code Online (Sandbox Code Playgroud)

有没有办法指定我希望src矢量中的所有元素都是某种颜色,同时允许target矢量中的所有元素都是不同的颜色?这将允许我在视觉上区分src节点和target网络中的节点.

目前似乎不支持此功能simpleNetwork()(但我希望有人可以帮助我使用自制程序脚本):

在此输入图像描述

这里提出了一个类似但不相关的问题.

Pet*_*lis 10

以下是如何使用控制节点的颜色forceNetwork.请注意,这仍然不会告诉您链接的方向,因为某些节点是某些链接的源和其他链接的目标 - 因此您需要以某种方式重新考虑该逻辑.但无论如何,这是控制节点的颜色.

# Load package
library(networkD3)
library(dplyr) # to make the joins easier

# Create fake data
src <- c("A", "A", "A", "A",
         "B", "B", "C", "C", "D")
target <- c("B", "C", "D", "J",
            "E", "F", "G", "H", "I")
networkData <- data.frame(src, target, stringsAsFactors = FALSE)

nodes <- data.frame(name = unique(c(src, target)), stringsAsFactors = FALSE)
nodes$id <- 0:(nrow(nodes) - 1)


# create a data frame of the edges that uses id 0:9 instead of their names
edges <- networkData %>%
   left_join(nodes, by = c("src" = "name")) %>%
   select(-src) %>%
   rename(source = id) %>%
   left_join(nodes, by = c("target" = "name")) %>%
   select(-target) %>%
   rename(target = id)

edges$width <- 1

# make a grouping variable that will match to colours
nodes$group <- ifelse(nodes$name %in% src, "lions", "tigers")

# simple with default colours
forceNetwork(Links = edges, Nodes = nodes, 
             Source = "source",
             Target = "target",
             NodeID ="name",
             Group = "group",
             Value = "width",
             opacity = 0.9,
             zoom = TRUE)

# control colours with a JS ordinal scale
# edited 20 May 2017 with updated code from Renal Chesak's answer:
ColourScale <- 'd3.scaleOrdinal()
            .domain(["lions", "tigers"])
           .range(["#FF6900", "#694489"]);'

forceNetwork(Links = edges, Nodes = nodes, 
             Source = "source",
             Target = "target",
             NodeID ="name",
             Group = "group",
             Value = "width",
             opacity = 0.9,
             zoom = TRUE,
             colourScale = JS(ColourScale))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 将节点全部标记会很好.你能否扩展你的答案来展示如何使节点(对于`src`和`target`)自动显示其名称而不是仅仅是悬停可访问性? (2认同)

Ren*_*sak 5

彼得·埃利斯(Peter Ellis)上面的答案可能曾经有效,但似乎代码已在新版本中更新。相反d3.scale.ordinal().range([]),您将不得不使用d3.scaleOrdinal().range([])

  • 谢谢。我不经常使用这种组合,只有在您在这里回答三年后才看到变化,当时我想知道为什么这不再起作用!我已经编辑了我原来的答案作为回应。 (2认同)