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

如何对齐并避免单独创建后添加到绘图网格的多个图例重叠?

解决多图网格与独立图例的布局对齐问题

你当前用cowplot构建多图网格+双图例时出现重叠、布局混乱的问题,以下是适配任意数量变量和网格图的通用解决方案:

方案1:优化图例组合的对齐与间距

步骤1:给图例添加边距,避免重叠

在创建图例绘图时,为每个图例添加外围边距,确保图例间有足够空白:

library(ggplot2)
library(cowplot)

# 图例1:分类图例
dfLegend_1 <- data.frame(x = LETTERS[1:10], y = c(1:10))
pointColours <- c(A = "#F5736A", B = "#D58D00", C = "#A0A300",
                  D = "#36B300", E = "#00BC7B", F = "#00BCC2",
                  G = "#00ADF4", H = "#928DFF", I = "#E568F0",
                  J = "#808080")

ggLegend_1 <- ggplot(dfLegend_1, aes(x=x, y=y))+
  geom_point(aes(fill = pointColours), shape = 22, size = 10) +
  scale_fill_manual(values = unname(pointColours),
                    label = names(pointColours),
                    name = 'Variable') +
  theme(
    legend.key.size = unit(0.5, "cm"),
    legend.box.margin = margin(t=10, b=10, l=5, r=5) # 添加图例外围边距
  ) +
  theme_void()

legend_1 <- get_legend(ggLegend_1)

# 图例2:渐变图例
dflegend_2 <- data.frame(
  x = runif(100),
  y = runif(100),
  z2 = abs(rnorm(100))
)

ggLegend_2 <- ggplot(dflegend_2, aes(x=x, y = y))+
  geom_point(aes(color = z2), shape = 22, size = 10) +
  scale_color_gradientn(
    colours = rev(colorRampPalette(c('steelblue', '#f7fcfd', 'orange'))(5)),
    limits = c(0,10),
    name = 'Gradient',
    guide = guide_colorbar(
      frame.colour = "black",
      ticks.colour = "black"
    )) +
  theme(
    legend.box.margin = margin(t=10, b=10, l=5, r=5) # 添加图例外围边距
  )

legend_2 <- get_legend(ggLegend_2)

步骤2:垂直对齐图例并调整高度比例

组合图例时,启用垂直对齐,并根据图例内容的高度设置比例,确保布局均匀:

# 组合两个图例,垂直对齐,按高度比例分配空间
legendFinal <- plot_grid(legend_2, legend_1, 
                         ncol = 1, 
                         align = "v", # 垂直对齐
                         axis = "l",  # 沿左侧对齐
                         rel_heights = c(1, 2) # 渐变图例与分类图例的高度比例
                         )

步骤3:组合网格图与图例,调整宽度比例

根据图例总宽度调整网格与图例的宽度占比,避免图例被压缩:

# 创建20个网格图
dfGrid <- data.frame(x = rnorm(10), y = rnorm(10))
plotList <- list()
for(i in 1:20){
  plotList[[i]] <- ggplot(dfGrid) +
    geom_ribbon(aes(x = x, ymin = min(y), ymax = 0), fill = "red", alpha = .5) +
    geom_ribbon(aes(x = x, ymin = 0, ymax = max(y)), fill = "blue", alpha = .5) +
    theme_void()
}
gridFinal <- cowplot::plot_grid(plotlist = plotList)

# 组合网格与图例,调整宽度比例
plot_grid(gridFinal, legendFinal,  rel_widths = c(4, 1))

方案2:手动定位图例(更灵活适配任意数量图例)

如果需要添加多个图例,用ggdraw手动控制每个图例的位置和大小,完全避免重叠问题:

# 手动绘制最终图:网格图占左侧75%宽度,两个图例分别放在右侧上下区域
final_plot <- ggdraw() +
  draw_plot(gridFinal, x = 0, y = 0, width = 0.75, height = 1) +
  draw_plot(legend_2, x = 0.76, y = 0.6, width = 0.24, height = 0.35) +
  draw_plot(legend_1, x = 0.76, y = 0, width = 0.24, height = 0.55)

print(final_plot)

这种方法可以自由调整每个图例的位置,适合3个及以上图例的场景,完全适配任意数量的变量和网格布局。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:45:59