ggplot2和Shiny:如何根据图像大小调整图例的大小?

12

在ggplot2中,元素的大小是单独指定的。当图形的大小改变时,例如图例不会改变大小。这可能是Shiny应用程序的一个问题,因为输出的ggplot2图形大小随浏览器窗口的变化而改变。以下是一个虚拟的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个回答

8
这是一种锚定图例顶部的方法,从而不使其超出绘图区域。您只需在 ggplot 的主题中添加 legend.justification(0.5, 1) 即可。第一个值居中图例的 x 位置。第二个值将图例的 y 位置“上对齐”。(如果需要,您可以通过将第一个值更改为 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)
    }
  )
}

以下是在“小”和“大”浏览器窗口中看起来的图片。

输入图片描述

输入图片描述


谢谢。这使得图形更好了。 - GL_Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接