[英]R networkD3 package: node coloring in simpleNetwork()
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)
有沒有辦法指定我希望src
矢量中的所有元素都是某種顏色,同時允許target
矢量中的所有元素都是不同的顏色? 這將允許我在視覺上區分src
節點與網絡中的target
節點。
simpleNetwork()
似乎當前不支持此功能(但我希望有人可以幫助我使用自制程序腳本):
這里提出了一個類似但不相關的問題。
以下是使用forceNetwork
控制節點顏色的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))
Peter Ellis上面的回答可能曾經有過,但似乎代碼已在新版本中更新。 而不是d3.scale.ordinal().range([])
,你將不得不使用d3.scaleOrdinal().range([])
您可以執行與鏈接帖子類似的操作,但這是使用visNetwork
包的示例。 這個包與vis.js接口,並且制作了非常好的交互式圖形。
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
彼得埃利斯的答案完成了這項工作,但這是另一種方法,它更簡潔,更容易理解......
(另外,應該注意的是,節點可以同時位於source
向量和target
向量中,在這種情況下,根據您的規范,它們應該是哪種顏色是不確定的。)
library(networkD3)
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)
# make a nodes data frame out of all unique nodes in networkData
nodes <- data.frame(name = unique(c(networkData$src, networkData$target)))
# make a group variable where nodes in networkData$src are identified
nodes$group <- nodes$name %in% networkData$src
# make a links data frame using the indexes (0-based) of nodes in 'nodes'
links <- data.frame(source = match(networkData$src, nodes$name) - 1,
target = match(networkData$target, nodes$name) - 1)
forceNetwork(Links = links, Nodes = nodes, Source = "source",
Target = "target", NodeID ="name", Group = "group",
opacity = 1, opacityNoHover = 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.