将共享图例对齐到绘图网格的中心(使用cowplot)

Posted

技术标签:

【中文标题】将共享图例对齐到绘图网格的中心(使用cowplot)【英文标题】:Align shared legends to the center of the plot grid (with cowplot) 【发布时间】:2018-03-20 14:01:45 【问题描述】:

可以在包cowplot的本教程中找到可重现的示例。

https://cran.r-project.org/web/packages/cowplot/vignettes/shared_legends.html

复制示例代码:

library(ggplot2)
library(cowplot)
#down-sampled diamonds data set
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]

# Make three plots.
# We set left and right margins to 0 to remove unnecessary spacing in the
# final plot arrangement.
p1 <- qplot(carat, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt"))
p2 <- qplot(depth, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")
p3 <- qplot(color, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")

# arrange the three plots in a single row
prow <- plot_grid( p1 + theme(legend.position="none"),
           p2 + theme(legend.position="none"),
           p3 + theme(legend.position="none"),
           align = 'vh',
           labels = c("A", "B", "C"),
           hjust = -1,
           nrow = 1
           )
legend_b <- get_legend(p1 + theme(legend.position="bottom"))

# add the legend underneath the row we made earlier. Give it 10% of the height
# of one plot (via rel_heights).
p <- plot_grid( prow, legend_b, ncol = 1, rel_heights = c(1, .2))
p

此示例显示了一个图例,其中图例与网格的左下角对齐。 然而,它过去有所不同,因为图例随后被绘制成与图的底部中心对齐。这是几个月前我的个人代码生成的示例。 https://s1.postimg.org/8pf2en1zen/Untitled.png(上传工具目前不适合我)

在任一包中发生未知数量的更改后重新运行我的旧代码会提供与左下角对齐的图例(如教程中所示,上图第三个图): https://s1.postimg.org/3agjw7n9gf/Untitled2.png

问题是如何调整代码以绘制与底部中心对齐的图例。

【问题讨论】:

【参考方案1】:

你可以这样设置legend_b:

legend_b <- get_legend(p1 + theme(legend.position=c(0.3,0.8),legend.direction = "horizontal"))

更好的方法:

legend_b <- get_legend(p1 + theme(legend.direction = "horizontal",legend.justification="center" ,legend.box.just = "bottom"))

【讨论】:

谢谢。我猜这确实需要对其他图例大小进行“反复试验”。 legend_b &lt;- get_legend(p1 + theme(legend.position="none",legend.direction = "horizontal")) 这也适用于我。 get_legend(p1 + theme(legend.position = "none", legend.direction = "horizo​​ntal")) 中的错误:绘图必须包含图例 legend_b &lt;- get_legend(p1 + theme(legend.direction = "horizontal",legend.justification="center" ,legend.box.just = "bottom")) 试试这个 这看起来不错。您可能想更新您的答案。

以上是关于将共享图例对齐到绘图网格的中心(使用cowplot)的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签AB设置组合图像使用共享的图例(shared legend in cowplot)

如何使用`cowplot`软件包中的`plot_grid`对齐地块最后一列中的图例?

使用cowplot将x轴切换到顶部时左对齐的轴标签

如何将普通的ggplot与cowplot中的多面对齐?

使用 plot_grid 和 cowplot 删除 NULL 图上的标签

与 cowplot 和 plot_grid 共享面板边框