ggplot2中用dplyr的filter筛选COD_REG=13绘图报错的解决方法
报错原因排查与解决办法
核心问题
报错Input ..1 must be of size 106 or 1, not size 107本质是ggplot填充映射的数据维度与地理图层要素数量不匹配:用于填充的wage数据行数,和筛选后的地理区域要素数不一致,导致图层渲染冲突。
可能的原因
- 关联后数据行数膨胀:
prov2022地理数据集本身有107条记录,database只有106条,用right_join会保留prov2022的所有行,生成107条数据(其中1条无匹配的wage值)。后续筛选COD_REG == 13时,填充数据与地理要素的维度无法对应。 - 筛选时机错误:先对
prov2022筛选区域,再和database做right_join,此时筛选后的地理要素数与database的106条记录不匹配,引发维度冲突。 - 关联键重复:
database或prov2022中存在重复的关联键(如COD_REG),导致right_join后出现重复行,数据行数从106变为107,后续筛选时维度不兼容。
解决办法
1. 调整操作顺序:先筛选地理区域,再关联数据
先缩小地理数据范围,再和业务数据关联,确保关联后的数据行数与地理要素数完全匹配:
# 第一步:筛选目标地理区域 filtered_prov <- prov2022 %>% filter(COD_REG == 13) # 第二步:关联业务数据(替换by参数为实际的关联键,比如COD_REG) joined_data <- right_join(filtered_prov, database, by = "COD_REG") # 绘图 ggplot(joined_data) + geom_sf(aes(fill = ifelse(wage > 500 & wage <= 1000, "purple", NA))) + scale_fill_identity()
2. 清理关联键,避免重复匹配
先检查并清理关联键的重复值,确保关联后数据行数正常:
# 检查database中关联键的重复情况 database %>% count(COD_REG) %>% filter(n > 1) # 检查prov2022中关联键的重复情况 prov2022 %>% count(COD_REG) %>% filter(n > 1) # 清理database重复数据:保留每个COD_REG的第一条记录 database_clean <- database %>% distinct(COD_REG, .keep_all = TRUE) # 或者对wage做聚合(比如取均值) # database_clean <- database %>% group_by(COD_REG) %>% summarise(wage = mean(wage)) # 关联并筛选后绘图 joined_data <- right_join(prov2022, database_clean, by = "COD_REG") %>% filter(COD_REG == 13) ggplot(joined_data) + geom_sf(aes(fill = ifelse(wage > 500 & wage <= 1000, "purple", NA))) + scale_fill_identity()
3. 确保填充数据与地理维度匹配
如果必须先关联再筛选,检查数据行数是否一致,并处理缺失值:
joined_data <- right_join(prov2022, database, by = "COD_REG") %>% filter(COD_REG == 13) # 验证数据行数是否匹配 cat("筛选后地理要素数:", nrow(prov2022 %>% filter(COD_REG == 13)), "\n") cat("关联后数据行数:", nrow(joined_data), "\n") # 绘图时处理缺失的wage值 ggplot(joined_data) + geom_sf(aes(fill = ifelse(!is.na(wage) & wage > 500 & wage <= 1000, "purple", NA))) + scale_fill_identity()
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

