2015-12-14 19 views
10

In ggplot2 le dimensioni degli elementi sono specificate separatamente. Quando cambia la dimensione della figura, gli elementi, ad esempio la legenda, non cambiano. Questo potrebbe essere un problema in Shiny quando la dimensione dell'output di figure ggplot2 cambia con la finestra del browser. Di seguito è riportato il codice di un'app fittizia Shiny e due figure di output con dimensioni diverse della finestra del browser. La figura più piccola è brutta in quanto parte della sua leggenda è stata tagliata.ggplot2 e Shiny: come ridimensionare la dimensione della legenda con la dimensione della figura?

Esiste un metodo per ridimensionare la dimensione della legenda con la dimensione della figura direttamente in ggplot2 senza pre-salvare la figura come file immagine per le app lucide?

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) 

La figura in una finestra del browser più grande sembra buono: enter image description here

Ma nella piccola finestra del browser, la parte superiore della leggenda non si presenta:

enter image description here

risposta

8

Ecco un modo di ancorare la parte superiore della legenda in modo che non scappi dalla parte superiore dell'area del tracciato. Devi solo aggiungere legend.justification(0.5, 1) al ggplot theme. Il primo valore centra la posizione x della legenda. Il secondo valore "top giustifica" la posizione y della legenda. (Puoi giustificare a destra la legenda cambiando 0,5 a 1 per il primo valore, che manterrà la legenda dal bordo destro del grafico, se questo è un problema.) Questo non risolve il relativo problema di dimensionamento, ma la legenda completa sarà sempre visibile e nella stessa posizione.

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) 
    } 
) 
} 

Di seguito sono state inserite immagini di ciò che appare nelle finestre "piccole" e "grandi" del browser.

enter image description here

enter image description here

+0

Grazie. Questo rende la figura molto meglio. –

Problemi correlati