javascript - R网络D3包: forceNetwork() coloring

标签 javascript r d3.js networkd3

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

enter image description here

来源: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))

最佳答案

重新阅读您的问题和回复后,我认为您真正想知道的是......如何将您的数据分组。定义集群后,您可以在 nodes 中为每个节点设置组值。数据框作为其集群的名称/ID,然后是 networkD3将相应地为它们着色。

进一步了解您的问题,尚不清楚您要如何组合“不同的颜色源和目标节点”同时“根据集群为节点着色”......这些目标显然是冲突的,因为集群同时包含源节点和目标节点。您的问题的另一个问题是,在这些类型的网络中,一个节点可能既是源节点又是目标节点,因此您必须更清楚地了解如何为它们着色。我可以假设您将“目标”节点定义为仅链接到另一个节点的节点(从技术上讲,节点是源还是目标取决于节点之间链接的方向),但这不是一定是这种情况(我可以想象你可能有其他解释)。

要进行聚类,您需要查看 igraph包及其众多的聚类功能。例如...

使用 networkD3 中包含的悲惨世界数据,让我们回溯,直到我们只有一个包含源字符和目标字符的两列数据框......

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)

关于javascript - R网络D3包: forceNetwork() coloring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45179424/

相关文章:

r - 为什么预分配对列表有用?

r - 如何在 Shiny Dashboard 的框中将表格居中

javascript - 单击时恢复 x 轴值 - NVD3 LineChart

javascript - 通过 JQuery 加载和卸载 JS 文件的最佳方式

javascript - 在页面加载时启动模式

javascript - 浏览器崩溃时清除 sessionStorage

javascript - 散点图矩阵的工具提示 - 使用 d3

javascript - 当用户按 Enter 键时,它将下拉菜单内容和文本字段数据更改为默认值

r - 将第二个平面添加到 scatterplot3d

javascript - d3 javascript中的变量范围