求助:如何在Panel中批量绘制Shapefile多属性列?解决循环绘图报错
问题解决:循环绘制多属性GIS矢量图
你的核心问题是动态列名在aes()中无法被正确解析——直接传字符串i时,ggplot会把它当成离散的字符值,而非数据中的列,这就导致填充映射失效,还和连续色阶冲突。另外ggarrange的调用方式也需要调整。
修正后的代码如下:
library(terra) library(ggplot2) library(tidyterra) library(ggpubr) grids = vect('5k_grid_scenarios.gpkg') grids = grids %>% select(t1:t8) # 初始化空列表存绘图对象 p = list() for (i in names(grids)){ plot = grids %>% autoplot(aes(fill = .data[[i]])) + # 用.data[[i]]动态引用列 scale_fill_whitebox_c(palette = "pi_y_g") + labs(title = i) # 给每个图加对应属性的标题 p[[i]] = plot } # 用plotlist参数传入绘图列表,可设置行列数控制布局 ggarrange(plotlist = p, nrow = 2, ncol = 4)
关键修正点:
- 用
.data[[i]]替代直接写i:这是tidyverse生态中动态引用列的标准写法,能让ggplot正确识别循环中的列名对应的数据列,而非把i当成普通字符串。 - 调整
ggarrange调用:必须通过plotlist参数传入绘图列表,还可以通过nrow/ncol设置面板的行列布局,让8张图排列更整齐。 - 增加标题:通过
labs(title=i)给每个图标注对应的属性名,方便区分。
如果遇到类型问题(比如列不是数值型),可以先检查并转换列类型:
# 查看列类型 sapply(grids, class) # 如果是字符型,转成数值型 grids = grids %>% mutate(across(t1:t8, as.numeric))
内容的提问来源于stack exchange,提问作者gis.rajan
相关产品推荐
相关产品推荐

