Rで解析:インタラクティブな編集!ネットワーク図をぐりぐり動かせ!「visNetwork」パッケージの紹介

Rの解析に役に立つ記事
スポンサーリンク

vis.jsライブラリを利用した、インタラクティブに拡大、縮小、移動やノードとエッジの追加、削除、結合などが可能な「visNetwork」パッケージを紹介します。

パッケージバージョン2.1.2。windows11のR version 4.2.2で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("visNetwork")

実行コマンドの紹介

Rstudio利用すると、コマンドでもプロットをhtmlファイルに保存することができます。<単純な使用例>の後に<装飾や編集可能な図の出力例>のコマンドを紹介します。

<単純な使用例>

本パッケージでは「ノード」と「エッジ」の2つのデータを準備する必要があります。理解しやすいように「ノードid1」に他の4つのノードと自身のエッジが結合する例を紹介します。出力結果と合わせて確認ください。詳細はコメントを確認してください。

#パケージの読み込み
library("visNetwork")

#単純な使用例
#ノードid1にすべてのエッジが結合
#nodesとedgesのデータが必要です
#nodeデータの作成
nodes <- data.frame(
  #&#12494;&#12540;&#12489;id
  id = 1:5,
  #&#12494;&#12540;&#12489;&#12521;&#12505;&#12523;
  label = paste("node", 1:5))

#edges&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
edges <- data.frame(
  #&#12456;&#12483;&#12472;&#12398;&#22987;&#28857;
  from = 1:10,
  #&#12456;&#12483;&#12472;&#12398;&#32066;&#28857;
  to = 1,
  #&#12456;&#12483;&#12472;&#12521;&#12505;&#12523;&#12398;&#25351;&#23450;
  label = paste("edge", 1:10))

#&#12503;&#12525;&#12483;&#12488;
visNetwork(nodes, edges)

#&#12503;&#12525;&#12483;&#12488;&#12434;html&#12501;&#12449;&#12452;&#12523;&#12395;&#20445;&#23384;
#htmlwidgets::saveWidget&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12375;&#12414;&#12377;
#&#20445;&#23384;&#22580;&#25152;&#12398;&#25351;&#23450;
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;"), sep = "", collapse ="")))
network <- visNetwork(nodes, edges)
htmlwidgets::saveWidget(network, "network.html")

<装飾や編集可能な図の出力例>

「ノードやエッジの装飾を適応」、「ダイアログでノード周辺をハイライト」、「プロットをリアルタイムに編集」するコマンド例です。詳細はコメントを確認してください。

#&#35013;&#39166;&#12434;&#36969;&#24540;&#12375;&#12383;&#12487;&#12540;&#12479;&#21442;&#32771;&#20363;&#12398;&#20316;&#25104;
#node&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
nodes <- data.frame(#&#12494;&#12540;&#12489;id
  id = 1:10,
  #&#12494;&#12540;&#12489;&#12521;&#12505;&#12523;
  label = paste("node", 1:10),
  #&#12494;&#12540;&#12489;&#12464;&#12523;&#12540;&#12503; 
  group = c("GrA", "GrB"),
  #&#12471;&#12531;&#12508;&#12523;&#12469;&#12452;&#12474;
  value = 1:10,
  #&#12494;&#12540;&#12489;&#12471;&#12531;&#12508;&#12523;&#12398;&#35373;&#23450;
  shape = c("square", "triangle", "box", "circle", "dot", "star",
            "ellipse", "database", "text", "diamond"),
  #&#12484;&#12540;&#12523;&#12481;&#12483;&#12503;&#12398;&#25351;&#23450;
  #&#12494;&#12540;&#12489;&#12471;&#12531;&#12508;&#12523;&#12395;&#12459;&#12540;&#12477;&#12523;&#12434;&#21512;&#12431;&#12379;&#12427;&#12392;&#34920;&#31034;&#12373;&#12428;&#12414;&#12377;
  title = paste0("<<", 1:10,">>"),
  #&#33394;&#12398;&#35373;&#23450;
  color = c("#e1e6ea", "#505457", "#4b61ba", "#a87963", "#deb7a0",
            "#d9bb9c", "#28231e", "#EEFFFF", "#EEE0FF", "#F6CEDF"),
  #&#24433;&#12398;&#35373;&#23450;
  shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE))

#edges&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
edges <- data.frame(#&#12456;&#12483;&#12472;&#12398;&#22987;&#28857;
  from = sample(1:10,10),
  #&#12456;&#12483;&#12472;&#12398;&#32066;&#28857;
  to = sample(1:10, 10),
  #&#12456;&#12483;&#12472;&#12521;&#12505;&#12523;&#12398;&#25351;&#23450;
  label = paste("edge", 1:10),
  #&#12456;&#12483;&#12472;&#12398;&#38263;&#12373;&#12434;&#25351;&#23450;
  length = c(200,500),
  #&#12456;&#12483;&#12472;&#30690;&#21360;&#12398;&#31278;&#39006;&#12398;&#25351;&#23450;
  #"to", "from", "middle", "middle;to"&#12398;4&#31278;&#39006;&#12398;&#35373;&#23450;&#12364;&#21487;&#33021;&#12391;&#12377;
  arrows = c("to", "from", "middle", "middle;to", "from"), 
  #&#23455;&#32218;(TRUE)&#12289;&#30772;&#32218;(FALSE)&#12398;&#25351;&#23450;
  dashes = c(TRUE, FALSE),
  #&#12484;&#12540;&#12523;&#12481;&#12483;&#12503;&#12398;&#25351;&#23450;
  #&#12456;&#12483;&#12472;&#12521;&#12505;&#12523;&#12395;&#12459;&#12540;&#12477;&#12523;&#12434;&#21512;&#12431;&#12379;&#12427;&#12392;&#34920;&#31034;&#12373;&#12428;&#12414;&#12377;
  title = paste0("Color:", c("#e1e6ea", "#505457", "#4b61ba", "#a87963", 
                             "#deb7a0", "#d9bb9c", "#28231e", "#EEFFFF",
                             "#EEE0FF", "#F6CEDF")),
  #&#12473;&#12512;&#12540;&#12472;&#12531;&#12464;&#12398;&#25351;&#23450;
  smooth = c(FALSE, TRUE),
  #&#24433;&#12398;&#25351;&#23450;
  shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE))

#&#12494;&#12540;&#12489;&#12420;&#12456;&#12483;&#12472;&#12398;&#35013;&#39166;&#12434;&#36969;&#24540;
network1 <- visNetwork(nodes, edges)

#&#12503;&#12525;&#12483;&#12488;
network1

#&#12503;&#12525;&#12483;&#12488;&#12434;html&#12501;&#12449;&#12452;&#12523;&#12395;&#20445;&#23384;
#&#12394;&#12362;&#12289;&#20445;&#23384;&#12467;&#12510;&#12531;&#12489;&#12399;RStudio&#12391;&#23455;&#34892;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;
#&#20445;&#23384;&#22580;&#25152;&#12398;&#25351;&#23450;
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;"), 
                         sep = "", collapse ="")))
htmlwidgets::saveWidget(network1, "network1.html")

#&#12480;&#12452;&#12450;&#12525;&#12464;&#12391;&#12494;&#12540;&#12489;&#21608;&#36794;&#12434;&#12495;&#12452;&#12521;&#12452;&#12488;
network2 <- visNetwork(nodes, edges) %>%
  visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE)

#&#12503;&#12525;&#12483;&#12488;
network2

#&#12503;&#12525;&#12483;&#12488;&#12434;html&#12501;&#12449;&#12452;&#12523;&#12395;&#20445;&#23384;
#&#20445;&#23384;&#22580;&#25152;&#12398;&#25351;&#23450;
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;"), 
                         sep = "", collapse ="")))
htmlwidgets::saveWidget(network2, "network2.html")

#&#12503;&#12525;&#12483;&#12488;&#12434;&#12522;&#12450;&#12523;&#12479;&#12452;&#12512;&#12395;&#32232;&#38598;
network3 <- visNetwork(nodes, edges) %>% visOptions(manipulation = TRUE)

#&#12503;&#12525;&#12483;&#12488;
network3

#&#12503;&#12525;&#12483;&#12488;&#12434;html&#12501;&#12449;&#12452;&#12523;&#12395;&#20445;&#23384;
#&#20445;&#23384;&#22580;&#25152;&#12398;&#25351;&#23450;
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;"), 
                         sep = "", collapse ="")))
htmlwidgets::saveWidget(network3, "network3.html")

出力例

・単純な使用例

・ノードやエッジの装飾を適応

・ダイアログでノード周辺をハイライト

・プロットをリアルタイムに編集


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました