Shinyでもd3.jsを容易に使えるd3Networkパッケージを試した
最近、Rのd3Networkパッケージを使っている記事をいくつか目にした。d3Networkパッケージは、Rからd3.jsのnetwork、tree、dendogram、Sankeyを容易に描画することが出来るパッケージのようだ。great!!! そして開発者のページを見てみると「d3Network in Shiny web apps」なるものが! ということでさっそく試した。試したデータは普段分析している比較的小規模なネットワークのデータ。※ShinyはRで簡単にWebアプリ化することができるパッケージ。
> nd <- read.table("testdata.tsv", header=TRUE) > head(nd) Source Target 1 1 2 2 1 11 3 1 21 4 2 21 5 3 4 6 3 11 >
準備したui.Rとserver.Rは次の通り。開発者のサンプルでは不透明度合のopacityが引数になっていた。今回は斥力のchargeとノードの文字サイズのfont sizeをパタメータに追加してみた。また、shinyパッケージのfluidPage関数、fixedRow関数を使いUIを変えてみた。
ui.R
library(shiny) shinyUI(fluidPage( # Load d3.js tags$head(tags$script(src = 'http://d3js.org/d3.v3.min.js')), # Application title titlePanel('d3Network Shiny Example'), # Sidebar with a slider input for node opacity fixedRow( fixedRow( column(3, offset=1, sliderInput(inputId='sld_opc', label = 'node opacity', min = 0, max = 1, step = 0.01, value = 0.5 ) ), column(3, sliderInput(inputId='sld_charge', label = 'link charge', min = -500, max = -10, step = 10, value = -200 ) ), column(3, selectInput(inputId='sel_fontsize', label = 'font size', choices = c(8,10,12,14,16,18,20,24), selected= 12 ) ) ), hr(), # Show network graph fixedRow( column(12, htmlOutput('networkPlot') ) ) ) ))
server.R
library(d3Network) nd <- read.table("testdata.tsv", header=TRUE) shinyServer(function(input, output) { output$networkPlot <- renderPrint({ d3SimpleNetwork(nd, width=800, height=500, standAlone=FALSE, opacity = input$sld_opc, charge = input$sld_charge, fontsize = as.numeric(input$sel_fontsize), parentElement = "#networkPlot") }) })
実行するとブラウザではこんな感じに表示される。
library(shiny) runApp(appDir="d:/r/ShinyApp/d3Network") # shiny実行
当然ShinyServerでも動作する。
Rコンソールから試したい場合
htmlファイルに出力し、ブラウザを起動するといった流れの場合は下記のようにすれば良い。
library(d3Network) Source <- c("A", "A", "A", "A", "B", "B", "C", "C", "D") Target <- c("B", "C", "D", "J", "E", "F", "G", "H", "I") NetworkData <- data.frame(Source, Target) d3SimpleNetwork(NetworkData, width=1000, height=1000, standAlone=TRUE, file="aaa.html") browseURL("aaa.html")
出力したhtmlファイルを共有するってのもあり。
参考