2017-07-19 6 views
3

Hier zu passen ist mein Code:ggiraph Plot ist die Größe nicht auf die Seite

library(shiny) 
library(ggplot2) 
library(ggiraph) 

df <- data.frame(achseX = LETTERS[1:24], achseY = 1:24, facetX = as.factor(rep(1:4, each = 6))) 

server <- function(input, output) { 
    output$ggplot <- renderPlot({ 
    ggplot(data = df) + geom_bar_interactive(aes(tooltip = achseY, x = achseX, y = achseY), stat = "identity") + 
     theme_minimal() + facet_grid(.~ facetX, scales = "free_x") 
    }) 


    output$plot <- renderggiraph({ 
    gg <- ggplot(data = df) + geom_bar_interactive(aes(tooltip = achseY, x = achseX, y = achseY), stat = "identity") + 
     theme_minimal() + facet_grid(.~ facetX, scales = "free_x") 
    return(ggiraph(code = print(gg), selection_type = "multiple", zoom_max = 4, 
        hover_css = "fill:#FF3333;stroke:black;cursor:pointer;", 
        selected_css = "fill:#FF3333;stroke:black;")) 
    }) 
} 

ui <- fluidPage(
    "GGPLOT2:", 
    plotOutput("ggplot"), 
    "GGIRAPH:", 
    ggiraphOutput("plot", width = "500px", height = "1000px") 
) 

shinyApp(ui = ui, server = server) 

Das Ergebnis sieht so aus: enter image description here

Wie Sie im Code sehen können, der erste BarPlot ist ein ggplot das funktioniert so, wie es sollte. Es reagiert auf die Website und hat ein rechteckiges Format. Die ggiraph bleibt stattdessen in einem quadratischen Format und passt nicht auf die Seite.

Wie kann ich die ggiraph aussehen wie die ggplot?

versuchte ich mehrere Kombinationen der Breite und Höhe Argument, darunter auch width = "auto" und height = "auto". Dadurch passte der GGiraph zur Seite, aber immer noch in einem quadratischen Format.

Antwort

1

Sie können das UI mit einer gewissen Menge an Js-Code reagieren. Etwas in der Richtung von this Antwort.

Der Unterschied ist, dass dieFunktion die Eingabe in Zoll will, so müssen wir Pixel in Zoll konvertieren. Die Formel dafür ist inches = pixels/dpi. So übergibt der js-Code in der UI die Fensterhöhe und mit der dpi des Bildschirms, aus dem wir die Länge in Zoll berechnen können, die dann an die ggiraph-Funktion übergeben werden kann und die Plot als Reaktion auf dem Ui daher vornehmen.

Ich habe Ihr Beispiel geändert, um genau das zu tun. Ich hoffe es hilft!

library(shiny) 
library(ggplot2) 
library(ggiraph) 

df <- data.frame(achseX = LETTERS[1:24], achseY = 1:24, facetX = as.factor(rep(1:4, each = 6))) 

server <- function(input, output, session) { 
    output$ggplot <- renderPlot({ 
    ggplot(data = df) + geom_bar_interactive(aes(tooltip = achseY, x = achseX, y = achseY), stat = "identity") + 
     theme_minimal() + facet_grid(.~ facetX, scales = "free_x") 
    }) 


    output$plot <- renderggiraph({ 
    gg <- ggplot(data = df) + geom_bar_interactive(aes(tooltip = achseY, x = achseX, y = achseY), stat = "identity") + 
     theme_minimal() + facet_grid(.~ facetX, scales = "free_x") 
    return(ggiraph(code = print(gg), selection_type = "multiple", zoom_max = 4, 
        hover_css = "fill:#FF3333;stroke:black;cursor:pointer;", 
        selected_css = "fill:#FF3333;stroke:black;", 
        width_svg = (0.8*input$pltChange$width/input$pltChange$dpi), 
        height_svg = (0.5*input$pltChange$height/input$pltChange$dpi) 
        )) 
    }) 
} 

ui <- fluidPage(

    tags$body(tags$div(id="ppitest", style="width:1in;visible:hidden;padding:0px")), 

    tags$script('$(document).on("shiny:connected", function(e) { 
            var w = window.innerWidth; 
            var h = window.innerHeight; 
            var d = document.getElementById("ppitest").offsetWidth; 
            var obj = {width: w, height: h, dpi: d}; 
            Shiny.onInputChange("pltChange", obj); 
           }); 
           $(window).resize(function(e) { 
            var w = $(this).width(); 
            var h = $(this).height(); 
            var d = document.getElementById("ppitest").offsetWidth; 
            var obj = {width: w, height: h, dpi: d}; 
            Shiny.onInputChange("pltChange", obj); 
           }); 
          '), 


    "GGPLOT2:", 
    plotOutput("ggplot"), 
    "GGIRAPH:", 
    ggiraphOutput("plot") 
) 

shinyApp(ui = ui, server = server) 
Verwandte Themen