2016-03-21 13 views
3

Say Ich mache einen networkD3 Plot - das minimale Beispiel im Paket mitHintergrundfarbe ändern von networkD3 Plot

# 
library(networkD3) 

# Load data 
data(MisLinks) 
data(MisNodes) 

# Plot 
forceNetwork(Links = MisLinks, Nodes = MisNodes, 
      Source = "source", Target = "target", 
      Value = "value", NodeID = "name", 
      Group = "group", opacity = 0.8) 

Wenn ich diese öffnen im Browser, kann ich Entwickler-Tools verwenden, um die Hintergrundfarbe des Körpers zu ändern zu z background-color: #DAE3F9;"

Gibt es eine Möglichkeit, Hintergrundfarbe eines Diagramms (von Standardweiß) zu einer anderen Farbe automatisch zu definieren, ohne im Browser zu öffnen? Grundsätzlich können wir CSS direkt zum Code hinzufügen, wie wir JS-Funktionen hinzufügen können?

Antwort

2

Hier ist mein hack bei ihm. Es ist nicht schön, aber ich fügte eine Funktion in das linkDistance Argument hinzu, um die schmutzige Arbeit zu machen. Hoffentlich wird jemand kommt schließlich mit einer weniger kludgy Lösung:

forceNetwork(Links = MisLinks, Nodes = MisNodes, 
    Source = "source", Target = "target", 
    Value = "value", NodeID = "name", 
    Group = "group", opacity = 0.8, 
    linkDistance = 
    JS('function(){d3.select("body").style("background-color", "#DAE3F9"); return 50;}')) 

andere, ähnlich unattraktiv Option wäre ein clickAction Argument hinzuzufügen (zB clickAction = 'd3.select("body").style("background-color", "#DAE3F9")'), aber das würde nur den Hintergrund ändern, wenn ein Benutzer einen Knoten klickt .

+0

ha! Das ist eine sehr nette Art, es zu tun - es ist nie vorgekommen, einen anderen Parameter zu entführen. Ich denke, es funktioniert gut - aber vielleicht gibt es einen besseren Weg. Ich versuche zu denken, ob das irgendwelche unerwünschten Nebenwirkungen haben würde, aber es scheint in Ordnung zu sein. – jalapic

+2

@jalapic Ich wurde kreativ! Ich bin mir nicht sicher über Nebenwirkungen. FWIW, vielleicht wird ein besserer Weg direkt implementiert, wenn diese Feature-Anfrage zur Änderung der Hintergrundfarbe implementiert wird: https://github.com/christophergandrud/networkD3/issues/106 – Jota

5

Wenn möglich, können wir einige Hilfe von htmltools auf einige Arten verwenden.

library(networkD3) 

# Load data 
data(MisLinks) 
data(MisNodes) 

# Plot 
forceNetwork(Links = MisLinks, Nodes = MisNodes, 
      Source = "source", Target = "target", 
      Value = "value", NodeID = "name", 
      Group = "group", opacity = 0.8) 

library(htmltools) 

# don't like using the !important modifier 
# but without script not sure there is another way 
# to override the default white background 
browsable(
    tagList(
    tags$head(
     tags$style('body{background-color: #DAE3F9 !important}') 
    ), 
    forceNetwork(Links = MisLinks, Nodes = MisNodes, 
       Source = "source", Target = "target", 
       Value = "value", NodeID = "name", 
       Group = "group", opacity = 0.8) 
) 
) 

# if you want to limit the background-color to 
# the htmlwidget, we could wrap in tags$div 
browsable(
    tags$div(
    style = "background-color:#DAE3F9;", 
    forceNetwork(Links = MisLinks, Nodes = MisNodes, 
       Source = "source", Target = "target", 
       Value = "value", NodeID = "name", 
       Group = "group", opacity = 0.8) 
) 
) 

# if you are ok with script then we 
# we could do something like this 
browsable(
    tagList(
    forceNetwork(Links = MisLinks, Nodes = MisNodes, 
       Source = "source", Target = "target", 
       Value = "value", NodeID = "name", 
       Group = "group", opacity = 0.8), 
    tags$script(
' 
document.body.style.backgroundColor = "#DAE3F9" 
'  
    ) 
) 
)