You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2和cowplot组合多图并垂直排列不同图例

解决cowplot布局问题:实现图例垂直堆叠在右侧

我明白你想要的布局啦!你现在的问题是每次都用plot_grid横向拼接图例,导致两个图例并排显示,而不是垂直堆叠在右侧。咱们调整一下思路,先把两个图例组合成一个垂直的块,再和左边的图组横向拼接,就能实现你要的效果了。

修改后的完整代码

library(ggplot2)
library(cowplot)

# 生成基础绘图
p1 <- ggplot(iris, aes(Sepal.Length, fill = Species)) + 
  geom_density(alpha = .7)
p2 <- ggplot(iris, aes(Sepal.Width, fill = Species)) + 
  geom_density(alpha = .7)
p3 <- ggplot(iris, aes(Petal.Width, fill = Species)) + 
  geom_density(alpha = .7)

# 移除每个图的图例,避免重复显示
p1_noleg <- p1 + theme(legend.position = "none")
p2_noleg <- p2 + theme(legend.position = "none")
p3_noleg <- p3 + theme(legend.position = "none")

# 提取需要的两个图例
legend1 <- get_legend(p1)
legend2 <- get_legend(p2)

# 第一步:横向组合p2和p3
p2p3_row <- plot_grid(
  p2_noleg, 
  p3_noleg, 
  align = 'h', 
  labels = c("a", "b"), 
  hjust = -1, 
  nrow = 1,
  rel_widths = c(1, 1) # 保证两个图宽度一致
)

# 第二步:组合p1和p2+p3的行,形成左侧主绘图区域
left_main <- plot_grid(
  p1_noleg, 
  p2p3_row, 
  nrow = 1, 
  rel_widths = c(1, 1.2) # 可根据需求调整宽度比例
)

# 第三步:垂直堆叠两个图例,形成右侧图例面板
legend_stack <- plot_grid(
  legend1, 
  legend2, 
  nrow = 2,
  align = 'v' # 确保图例垂直对齐
)

# 第四步:组合主区域和图例面板,得到最终布局
final_plot <- plot_grid(
  left_main, 
  legend_stack, 
  rel_widths = c(2.5, 0.8), # 调整主图与图例的宽度占比
  align = 'v'
)

# 查看最终效果
final_plot

关键思路说明

  • 先把p2和p3横向拼接成一个独立的行模块,避免和其他元素混淆
  • 将p1与这个行模块组合,形成左侧的核心绘图区
  • 把两个需要的图例单独垂直堆叠成一个块,这样它们就会上下排列而不是左右并排
  • 最后把左侧绘图区和右侧图例块横向拼接,通过rel_widths参数可以灵活调整各部分的宽度比例,适配你的实际需求

内容的提问来源于stack exchange,提问作者captcoma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:29