我真的喜欢这个网络的样子:

来源:https://christophergandrud.github.io/networkD3/
每个扇区有多种颜色,其中每种颜色表示网络中与其他节点足够远的节点的某些不同部分。
但是,在任何一个特定的扇区中,我不喜欢src节点与target节点的颜色相同,因此我问了一个如何区分这两种颜色的问题(https://stackoverflow.com/a/35371131/3878253)。
现在,有没有一种方法可以扩展这段代码,以获得多颜色方案(以区分不同的扇区),同时保留漂亮的src/target颜色差异?代码如下:
# 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")
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))发布于 2017-07-20 19:32:36
在重新阅读你的问题和回答后,我认为你真正想知道的是……如何将你的数据分组。定义集群后,可以将nodes数据框中每个节点的组值设置为其集群的名称/id,然后networkD3将对它们进行相应的着色。
再深入你的问题,并不是很清楚你想要如何同时组合“不同的颜色源和目标节点”和“颜色节点根据它们的集群”……这些目标显然是冲突的,因为集群同时包含源节点和目标节点。您的问题的另一个问题是,在这些类型的网络中,一个节点可能既是源节点又是目标节点,因此您必须更清楚地了解这些节点的颜色。我可以假设您将“目标”节点定义为仅链接到其他节点的节点(从技术上讲,节点是源节点还是目标节点取决于节点之间链接的方向),但事实并非如此(我可以想象您可能会有其他解释)。
要进行集群,您需要查看igraph包及其众多集群函数。例如..。
使用networkD3中包含的Les Misérable数据,让我们回溯到只有一个包含源字符和目标字符的两列数据帧……
library(igraph)
library(networkD3)
data(MisLinks)
data(MisNodes)
lesmis <- data.frame(source = MisNodes$name[MisLinks$source + 1],
target = MisNodes$name[MisLinks$target + 1],
stringsAsFactors = F)现在,您可以使用igraph计算集群,然后在networkD3中将它们放回一起进行绘图……
lesmis <- graph_from_data_frame(lesmis)
wc <- cluster_walktrap(lesmis)
members <- membership(wc)
lesmis <- igraph_to_networkD3(lesmis, group = members)
forceNetwork(Links = lesmis$links, Nodes = lesmis$nodes,
Source = 'source', Target = 'target',
NodeID = 'name', Group = 'group', opacity = 1)现在,如果您想让“目标”节点(那些只有一个链接的节点)也具有不同的颜色,您可以找出哪些节点在源和目标列表中只出现一次,并将它们在nodes数据框中的组值设置为某个唯一的值……
allnodes <- c(lesmis$links$source, lesmis$links$target)
targetids <- allnodes[!duplicated(allnodes) & ! duplicated(allnodes, fromLast = T)]
lesmis$nodes$group[targetids + 1] <- 'target'
forceNetwork(Links = lesmis$links, Nodes = lesmis$nodes,
Source = 'source', Target = 'target',
NodeID = 'name', Group = 'group', opacity = 1)发布于 2017-07-19 15:44:38
Nodes数据框中的group列决定了颜色。可以为每个节点设置group值(手动或以其他方式设置),networkD3将根据调色板为每组节点上色。
例如..。
edges <- read.table(header = T, text = '
source target width
0 1 1
0 2 1
0 3 1
0 4 1
1 5 1
1 6 1
2 7 1
2 8 1
3 9 1
')
nodes <- read.table(header = T, text = '
name id group
A 0 panther
B 1 leopard
C 2 tiger
D 3 lion
J 4 panthercub
E 5 leopardcub
F 6 leopardcub
G 7 tigercub
H 8 tigercub
I 9 lioncub
')
forceNetwork(Links = edges, Nodes = nodes,
Source = "source",
Target = "target",
NodeID ="name",
Group = "group",
Value = "width",
opacity = 0.9,
zoom = TRUE,
colourScale = JS("d3.scaleOrdinal(d3.schemeCategory10);"))https://stackoverflow.com/questions/45179424
复制相似问题