首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R networkD3包: simpleNetwork()中的节点着色

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

Stack Overflow用户
提问于 2016-02-08 22:02:43
回答 4查看 6.5K关注 0票数 13

networkD3包(请参阅这里这里)允许用户创建简单的交互式网络:

代码语言:javascript
复制
# 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)

是否有一种方法可以指定src向量中的所有元素都是特定的颜色,同时允许target向量中的所有元素都是不同的颜色?这将使我能够直观地区分网络中的src节点和target节点。

这个功能目前在simpleNetwork()中似乎不受支持(但我希望有人能帮助我编写一个自制脚本):

一个类似但不相关的问题是问这里

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-12 19:55:20

下面是如何用forceNetwork控制节点的颜色。注意,这仍然不能告诉您链接的方向,因为有些节点是某些链接的源,而另一些则是目标--因此您需要重新思考这种逻辑。但是无论如何,这是节点的控制颜色。

代码语言:javascript
复制
# 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))

票数 14
EN

Stack Overflow用户

发布于 2017-04-14 14:55:42

Peter上面的答案可能曾经起过作用,但是看起来代码已经在一个新版本中被更新了。而不是d3.scale.ordinal().range([]),您将不得不使用d3.scaleOrdinal().range([])

票数 5
EN

Stack Overflow用户

发布于 2016-02-09 03:07:58

您可以在链接post中执行类似的操作,但是下面是一个使用visNetwork包的示例。这个包与vis.js接口,并制作了非常好的交互式图形。

代码语言:javascript
复制
library(visNetwork)
id <- unique(c(src, target))                                  # node ids
nodes <- data.frame(id, group=+(id %in% src),                 # add a grouping for src/target
  label=id, title=sprintf('<p>Node %s</p>', id))              # add some labels
g <- visNetwork(nodes=nodes, edges=networkData, width="75%")  # make graph
visExport(visHierarchicalLayout(g))                           # make it tree-like

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35280218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档