2015-12-14 26 views
10

W ggplot2 wielkość elementów określa się osobno. Kiedy zmienia się rozmiar figury, elementy, na przykład legenda, nie zmieniają się. Może to stanowić problem w Shiny, gdy wielkość danych wyjściowych ggplot2 zmienia się wraz z oknem przeglądarki. Poniżej znajduje się kod manekinowej aplikacji Shiny i dwóch liczb wyjściowych w różnych rozmiarach okna przeglądarki. Mniejsza figurka jest brzydka, ponieważ część jej legendy została odcięta.ggplot2 i Shiny: jak skalować rozmiar legendy z rozmiarem rysunku?

Czy istnieje metoda skalowania rozmiaru legendy o wielkości figury bezpośrednio w ggplot2 bez wstępnego zapisywania rysunku w postaci pliku obrazu na błyszczące aplikacje?

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) 

Postać w większym oknie przeglądarki wygląda dobrze: enter image description here

Ale w małym oknie przeglądarki, górna część legendy nie pojawi się:

enter image description here

Odpowiedz

8

Oto sposób zakotwiczenia górnej części legendy, tak aby nie przebiegała ona poza obszar wykresu. Po prostu dodajesz legend.justification(0.5, 1) do ggplot theme. Pierwsza wartość centruje pozycję x legendy. Druga wartość "top usprawiedliwia" pozycję y legendy. (Można prawym uzasadnić legendę zmieniając 0,5 do 1 dla pierwszej wartości, która będzie utrzymać legendę od zjechania prawej krawędzi wykresu, jeśli jest to problem). To nie rozwiąże względną problem rozmiaru, ale pełna legenda będzie zawsze widoczna w tej samej lokalizacji.

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

Poniżej zamieszczam zdjęcia tego, jak to wygląda w "małych" i "dużych" oknach przeglądarki.

enter image description here

enter image description here

+0

Dzięki. To sprawia, że ​​liczba jest znacznie lepsza. –

Powiązane problemy