【问题标题】:Is it possible to position the legend to the top right of a ggplot in R?是否可以将图例放置在 R 中 ggplot 的右上角?
【发布时间】:2014-10-09 06:36:10
【问题描述】:

我正在尝试为 ggplot 创建一个主题,然后我可以将其用于我的所有图表,并让它们看起来既漂亮又美观且统一。我想将图例从右侧垂直居中的当前位置移动到与右侧图形顶部对齐,如下面的红色箭头所示。

我想不通。我可以通过使用legend.position 将其定位在图的内部,但如果我随后执行legend.justification = c(0.0, 1.0),它会将图例推到它绘制的区域之外,它会被完全切断。我知道我可以通过为每个单独的图表处理 grobs 和 gtables 来为每个图表单独执行此操作,但我不想每次绘制图表时都必须这样做。

有没有办法用theme 做这个?

【问题讨论】:

标签: r ggplot2


【解决方案1】:

似乎终于可以使用 ggplot2 2.2.0

library(ggplot2)
ggplot(mpg, aes(displ, hwy, colour=fl)) + 
  geom_point() + 
  theme(legend.justification = "top")

【讨论】:

    【解决方案2】:
    library(ggplot2)
    
    p <- ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) + 
      geom_point() +
      theme(legend.background = element_rect(colour = "black", size = 0.5),
            panel.background = element_rect(colour = "black", size = 0.5))
    
    g <- ggplotGrob(p)
    
    leg <- g$grobs[[8]]
    leg$heights[3] <- unit(1,"null")
    leg$heights[1] <- unit(0,"null")
    # grid.newpage()
    # grid.draw(leg)
    g$grobs[[8]] <- leg
    grid.newpage()
    grid.draw(g)
    

    【讨论】:

    • 不错。但我想要一些我可以可靠地应用于所有地块的东西,不幸的是,如果使用 faceting,grobs 的幻数会有所不同。此外,我之前发现这种 grob-hacking 在 ggplot 版本之间非常不稳定。
    • 这也是我的经验,每次 ggplot2 更新都破坏了我的代码,所以我已经停止为核心包中未实现的东西推荐解决方法(这也是为什么没有什么意义的原因更一般)。但有时它可以用作一次性解决方案
    【解决方案3】:

    尝试使用主题选项,尤其是

    • legend.key.width
    • plot.margin

    试试这个:

    library(ggplot2)
    
    ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) + 
        geom_point() + 
        theme(
            legend.position=c(1,1), 
            legend.justification=c(0, 1), 
            legend.key.width=unit(1, "lines"), 
            plot.margin = unit(c(1, 5, 0.5, 0.5), "lines")
        )
    

    【讨论】:

    • 使用这种方法的问题是需要对图例中的特定元素进行调整 - 较短的项目需要较小的边距,较长的项目需要较大的边距 - 所以我会每次制作新图表时都需要手动调整它;我希望有一些我可以应用而无需每次调整的东西。
    【解决方案4】:

    我发现的最简单的 hack 是

    ggplot(data.frame(x=1:3, y=1:3), aes(x=x, y=y, colour=x)) + geom_point() + 
      theme(plot.margin=unit(c(5,5,1,1),"cm"), legend.position=c(1.1, 1.1))
    

    您也可以使用legend.justification 参数,例如设置它到"top"

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多