2017-07-19 14 views
2

私は本当にこのネットワークがどのように見えるかのように:R networkD3パッケージ:forceNetwork()着色

enter image description here

出典:https://christophergandrud.github.io/networkD3/

各色は、いくつかの異なる部分を表し、各部門のための複数の色があります。ネットワーク内のノードの数は、他のノードから十分に離れています。

しかし、いずれの特定のセクターでも、ノードがtargetノードとどのように同じ色になっているのが好きではないので、2色の区別方法について質問しました(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)) 

答えて

0

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);")) 
+0

あなたが述べたように、この解決策は、手動で 'nodes'データフレームの' group'列の値を設定する必要があります。しかし、私は、このプロセスを自動化する方法があるかどうかを尋ねています。これは、ソースコードがネットワークのさまざまなセクターの色付けを自動的に行います。大規模なネットワークでは、これは大きなプラスになります(つまり、非常に素晴らしくスケーラビリティがあります)。私はあなたの答えが好きです、それは最初の場所で着色の概念がどこから来るかを示しています。 – warship

+0

ノードのデータフレームを前処理して、任意の方法でグループ値を設定できます。特定のユースケースを指定した場合、その作業を手伝うことができますが、詳細を知らなくても無限に近い可能性があります。 –

0

は、私はグループにあなたのデータをクラスタ化する方法を...あなたが本当に知りたいことだと思います。クラスタを定義したら、nodesデータフレーム内の各ノードのグループ値をそのクラスタの名前/ IDとして設定し、それに応じてnetworkD3を色付けします。クラスタは、両方のソースが含まれているため

はまた、あなたの質問に、それは明らかに...これらの目標の競合あなたは同時に「そのクラスタに応じた色・ノード」「色ソースとターゲット・ノードは異なる」を組み合わせたい正確にどのように明確ではありませんターゲットノード。あなたの質問にはもう一つの問題があります。これらのタイプのネットワークでは、ノードがソースノードとターゲットノードの両方になる可能性があるため、それらをどのように色付けしたいかについてより明確にする必要があります。私はあなたが他の1つのノード(技術的には、ノードがソースまたはターゲットであるかどうかはノード間のリンクの方向によって決まる)にのみリンクされているものとして 'ターゲット'ノードを定義すると仮定することができますが、そうではありません必然的に(私はあなたが持っているかもしれない他の解釈を想像することができます)。

クラスタリングを実行するには、igraphパッケージと多数のクラスタリング機能を調べる必要があります。例えば...レ・ミゼラブルデータを使用して

たちは、ソースとターゲットの文字でちょうど2つのカラムのデータフレームを持つまでのは後戻りせ、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) 

あなたは「ターゲット」ノード(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) 
関連する問題