読者です 読者をやめる 読者になる 読者になる

でたぁっ 感動と失敗の備忘録

データ解析を担当することになったサラリーマンの備忘録

Shinyでもd3.jsを容易に使えるd3Networkパッケージを試した

R

 最近、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実行

f:id:deta:20140513230959p:plain
 当然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ファイルを共有するってのもあり。


参考