12

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()(しかし、誰かが自作スクリプトで私を助けてくれることを願っています):

ここに画像の説明を入力

同様の、しかし関連のない質問がここで尋ねられました

4

4 に答える 4

13

でノードの色を制御する方法は次のとおり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))

ここに画像の説明を入力

于 2016-02-12T19:55:20.887 に答える
4

上記の Peter Ellis の回答は、一度は機能した可能性がありますが、新しいリリースでコードが更新されたようです。の代わりにd3.scale.ordinal().range([])、使用する必要がありますd3.scaleOrdinal().range([])

于 2017-04-14T14:55:42.657 に答える
1

リンクされた投稿と同様のことができますが、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

ここに画像の説明を入力

于 2016-02-09T03:07:58.147 に答える