ggplot2和Shiny:如何根据图形大小缩放图例的大小?

时间:2015-12-14 18:55:07

标签: r ggplot2 shiny

在ggplot2中,元素的大小是单独指定的。当图形的大小发生变化时,元素(例如图例)不会改变。当输出ggplot2数字的大小随浏览器窗口而变化时,这可能是Shiny中的问题。下面是虚拟Shiny应用程序的代码和不同浏览器窗口大小的两个输出数字。较小的数字是丑陋的,因为其传奇的一部分已被切断。

是否有一种方法可以直接在ggplot2中使用图形大小缩放图例大小而无需将图形预先保存为Shiny应用程序的图像文件?

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)

更大的浏览器窗口中的数字看起来很好: enter image description here

但是在小浏览器窗口中,图例顶部没有显示:

enter image description here

1 个答案:

答案 0 :(得分:8)

这是一种锚定图例顶部的方法,这样它就不会在绘图区域的顶部运行。您只需将legend.justification(0.5, 1)添加到ggplot theme即可。第一个值以图例的x位置为中心。第二个值“顶部证明”图例的y位置。 (您可以通过将第一个值更改为0.5来对图例进行右对齐,这样可以防止图例在图表的右边缘运行,如果这是一个问题。)这不能解决相对大小问题,但是完整的图例将始终可见并位于同一位置。

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

下面我在“小”和“大”浏览器窗口中插入了这些图像。

enter image description here

enter image description here