2015-12-14 6 views
10

In ggplot2 wird die Größe der Elemente separat angegeben. Wenn sich die Größe der Figur ändert, ändern sich die Elemente, zum Beispiel die Legende, nicht. Dies könnte ein Problem in Shiny sein, wenn sich die Größe der Ausgabe von ggplot2 Figuren mit dem Browserfenster ändert. Unten ist der Code einer Dummy-Shiny-App und zwei Ausgabezahlen bei unterschiedlicher Browserfenstergröße. Die kleinere Figur ist hässlich, da ein Teil ihrer Legende abgeschnitten wurde.ggplot2 und Shiny: Wie skaliert man die Größe der Legende mit der Figurgröße?

Gibt es eine Methode, um die Legendengröße mit der Zahlengröße direkt in ggplot2 zu skalieren, ohne die Figur als Bilddatei für Shiny-Apps zu speichern?

library(shiny) 
library(ggplot2) 

ui <- fluidPage(
    br(), br(), br(), 
    plotOutput("test", height = "auto") 
) 

server <- function(input, output, session) { 
    output$test <- renderPlot(
     height = function() { 
      0.8 * session$clientData$output_test_width 
     }, 
     expr = { 
      aaa <- ggplot(mtcars, aes(wt, mpg, color = cyl)) + 
       geom_point() + 
       theme(legend.position = c(0.9, 0.9)) 
      print(aaa) 
     } 
    ) 
} 

shinyApp(ui, server) 

Die Figur in einem größeren Browser-Fenster sieht gut aus: enter image description here

Aber in kleinen Browser-Fenster, das obere Ende der Legende nicht angezeigt wird:

enter image description here

Antwort

8

Hier ist ein Möglichkeit, den oberen Teil der Legende zu verankern, damit er nicht über den Plotbereich hinausragt. Sie fügen einfach legend.justification(0.5, 1) zum ggplot theme hinzu. Der erste Wert zentriert die x-Position der Legende. Der zweite Wert "top" begründet die y-Position der Legende. (Sie können die Legende rechtsbündig ausrichten, indem Sie für den ersten Wert 0,5 zu 1 ändern, wodurch die Legende nicht am rechten Rand des Diagramms abläuft, wenn dies ein Problem ist.) Dies löst das Problem der relativen Größenänderung nicht, aber Die vollständige Legende wird immer sichtbar und am selben Ort sein.

server <- function(input, output, session) { 
    output$test <- renderPlot(
    height = function() { 
     0.8 * session$clientData$output_test_width 
    }, 
    expr = { 
     aaa <- ggplot(mtcars, aes(wt, mpg, color = cyl)) + 
     geom_point() + 
     theme(legend.position = c(0.9, 0.98), 
       legend.justification=c(0.5, 1)) 
     print(aaa) 
    } 
) 
} 

Unten habe ich Bilder davon eingefügt, wie das in "kleinen" und "großen" Browserfenstern aussieht.

enter image description here

enter image description here

+0

Dank. Dies macht die Figur viel besser. –

Verwandte Themen