Ggplot2 и Shiny: как масштабировать размер легенды с размером фигуры?

В ggplot2 размер элементов указывается отдельно. Когда изменяется размер фигуры, элементы, например легенда, не изменяются. Это может быть проблемой в Shiny, когда размер выходных данных ggplot2 изменяется в окне браузера. Ниже приведен код манекена "Блестящее приложение" и две цифры вывода в разных размерах окна браузера. Меньшая фигура уродливая, поскольку часть ее легенды была отрезана.

Есть ли способ масштабирования размера легенды с размером фигуры непосредственно в ggplot2 без предварительного сохранения фигуры в качестве файла изображения для блестящих приложений?

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)

Рисунок в более крупном окне браузера выглядит хорошо: введите описание изображения здесь

Но в маленьком окне браузера верхняя часть легенды не отображается:

введите описание изображения здесь

Ответ 1

Здесь можно привязать верхнюю часть легенды, чтобы она не выходила из верхней части области графика. Вы просто добавляете legend.justification(0.5, 1) в ggplot theme. Первое значение центрирует положение x легенды. Второе значение "верхнее оправдывает" позицию y легенды. (Вы можете по праву оправдать легенду, изменив значение 0.5 на 1 для первого значения, что приведет к тому, что легенда будет работать от правого края графика, если это проблема.) Это не решает проблему относительного размера, но полная легенда всегда будет видна и находится в том же месте.

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

Ниже я вставил изображения того, что это выглядит в "маленьких" и "больших" окнах браузера.

введите описание изображения здесь

введите описание изображения здесь