如何让 forceNetwork {networkD3} 以 Shiny 应用程序为中心?
How to keep a forceNetwork {networkD3} centered in a Shiny app?
在构建一个显示 forceNetwork 图的 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))
})
图片中的行为:
Annndd...它不见了:
问题是 d3.force() 中的计时器已 运行 结束,而当输入新值时它不是 "reheated"。在不更改 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);')))
})
更新 (2017.03.20)
此问题已在最新发布的 networkD3 版本 (0.4) 中得到解决,OP 要求的是默认行为。
在构建一个显示 forceNetwork 图的 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))
})
图片中的行为:
问题是 d3.force() 中的计时器已 运行 结束,而当输入新值时它不是 "reheated"。在不更改 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);')))
})
更新 (2017.03.20)
此问题已在最新发布的 networkD3 版本 (0.4) 中得到解决,OP 要求的是默认行为。