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

如何将Terra包中Shapefile的多幅绘图合并到单一面板并共用图例?

问题:将多幅terra绘图合并到同一面板并共用图例

我们使用terra包的示例Shapefile数据:

library(terra)
v <- vect(system.file("ex/lux.shp", package="terra"))

目前已写出分三个不同y轴范围的绘图代码:

plot(v, "NAME_1", col=rainbow(25), border=c("gray"),ylim=c(49.5, 50))
plot(v, "NAME_1", col=rainbow(25), border=c("gray"),ylim=c(50, 50.5))
plot(v, "NAME_1", col=rainbow(25), border=c("gray"),ylim=c(49, 49.5))

请问如何将这三幅绘图展示在同一个面板中,并共用一个图例?


解决方案

你可以通过自定义绘图布局并单独绘制图例的方式实现需求,具体操作如下:

  • 先统一颜色调色板,保证三个子图配色一致:
col_pal <- rainbow(25)
  • 设置面板布局,为图例预留空间。比如设置3行2列的布局,右侧窄列用于放置图例:
layout(matrix(c(1,2,3,4,4,4), nrow=3, ncol=2), widths=c(4,1))
  • 依次绘制三个子图,关闭自动生成的图例(legend=FALSE):
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(49.5, 50), legend=FALSE)
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(50, 50.5), legend=FALSE)
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(49, 49.5), legend=FALSE)
  • 在预留位置绘制共用图例:
labels <- unique(v$NAME_1)
legend("center", legend=labels, fill=col_pal[1:length(labels)], bty="n")

如果希望图例放在底部,可调整布局矩阵:

layout(matrix(c(1,2,3,4), nrow=4, ncol=1), heights=c(3,3,3,1))
# 重复绘制三个子图(legend=FALSE)
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(49.5, 50), legend=FALSE)
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(50, 50.5), legend=FALSE)
plot(v, "NAME_1", col=col_pal, border="gray", ylim=c(49, 49.5), legend=FALSE)
# 绘制水平图例
legend("center", legend=labels, fill=col_pal[1:length(labels)], bty="n", horiz=TRUE)

这样就能让三个子图在同一面板展示,且共用一个统一的图例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:42:31