2017-03-13 15 views
3

forceNetworkグラフを表示するShinyアプリケーションを構築しているときに、ネットワークは中央に留まらず、インタラクティブに不透明度を変更すると視界から外れます。forceNetwork {networkD3}をShinyアプリケーションの中心に保つにはどうすればいいですか?

私の質問は、この動作をどのように変更して、最初はネットワークをきれいに中央に保つかです。

再現性の例:

ui.R:

library(shiny) 
library(networkD3) 

shinyUI(fluidPage( 

     titlePanel("ForceNetD3"), 

     sidebarLayout(
      sidebarPanel(
       sliderInput("opacity", 
         "Opacity", 
         min = 0.1, 
         max = 1, 
         value = 0.4) 
    ), 
     mainPanel(
      forceNetworkOutput(outputId = "net") 
    ) 
))) 

server.R:

library(shiny) 
library(networkD3) 

shinyServer(function(input, output) { 

     # Load data 
     data(MisLinks) 
     data(MisNodes)  

     output$net <- renderForceNetwork(forceNetwork(
          Links = MisLinks, Nodes = MisNodes, 
          Source = "source", Target = "target", 
          Value = "value", NodeID = "name", 
          Group = "group", opacity = input$opacity)) 
}) 

写真の中の行動:

enter image description here enter image description here Annndd ..それがなくなった:

enter image description here

答えて

2

問題がd3.forceでタイマーが()を実行していることで、新しい値が入力された場合には、「再加熱」されていません。 networkD3に変更を加えなければ、forceNetwork()関数の引数にcolourScale = JS('force.alpha(1); force.restart(); d3.scaleOrdinal(d3.schemeCategory20);')を追加することで、これをハックすることができます。だから、server.R ...

library(shiny) 
library(networkD3) 

shinyServer(function(input, output) { 

     # Load data 
     data(MisLinks) 
     data(MisNodes)  

     output$net <- renderForceNetwork(forceNetwork(
          Links = MisLinks, Nodes = MisNodes, 
          Source = "source", Target = "target", 
          Value = "value", NodeID = "name", 
          Group = "group", opacity = input$opacity, 
          colourScale = JS('force.alpha(1); force.restart(); d3.scaleOrdinal(d3.schemeCategory20);'))) 
}) 

UPDATE(2017年3月20日)

この問題はnetworkD3の最新リリースバージョン(0.4)で解決されていて、どのようなOPがあるためだろう求めているのはデフォルトの動作です。

+0

解決策が機能します。提案できる他のソリューションはありますか?そして、デフォルトの動作が望ましくないことに同意しますか? – Jim

+0

理論的には、評価される他のforceNetwork引数の1つにJavaScriptコマンドを挿入できます。 shinyに入力が変更されたときにJavaScriptコードを評価/実行する方法があれば、おそらく同様に動作します。私はデフォルトの動作が間違っているとは言いませんが、この目的に留意して設計されたものではありません。気にするなら、https://github.com/christophergandrud/networkD3/issuesで新しい問題を開くことができ、最終的にはそれに到達するかもしれません。 –

+0

これで、 'input $ opacity'が変わるたびに、グラフは左上隅から中央に"投げられ "ます。あなたの' colourScale' -JS'ハックを使ってルートノードを保持する方法がありますか(または任意のノード) – Jim

関連する問題