使用ggplot2与geom_sf绘图遇图例异常及Error: length(rows)==1 is not TRUE报错求助
解决ggplot2 + geom_sf绘图中线型图例错误及ddply报错问题
我来帮你搞定这两个头疼的问题!先逐个拆解:
问题1:线型要素的图例显示为填充框
这是因为当你在一张图里混合了多边形(比如面状地理数据)和线要素时,ggplot默认会沿用多边形的填充美学来生成图例,导致线要素的图例变成了不符合预期的填充框。解决方法很直接,通过override.aes手动指定线类图例的样式:
假设你的代码框架类似这样,只需添加图例覆盖的配置:
library(ggplot2) library(sf) # 示例加载面数据和线数据 polygon_data <- st_read("your_polygons.shp") line_data <- st_read("your_lines.shp") ggplot() + geom_sf(data = polygon_data, aes(fill = poly_category)) + geom_sf(data = line_data, aes(color = line_category, linetype = line_category)) + # 关键:强制线图例显示为线条而非填充框 guides( color = guide_legend(override.aes = list(fill = NA)), linetype = guide_legend(override.aes = list(fill = NA)) )
核心逻辑是用override.aes = list(fill = NA)去掉填充样式,让图例只渲染线条。
问题2:强制图例为线条时报错Error: length(rows) == 1 is not TRUE
这个报错几乎可以肯定是因为你用了plyr包的ddply()函数处理sf对象——sf是带几何列的特殊数据框,plyr的函数对它的兼容性极差,而dplyr才是sf官方推荐的配套工具。
解决步骤:
- 把所有
ddply()调用替换成dplyr的group_by()+summarise()/mutate()组合; - 处理图例相关的分组逻辑时,确保基于sf对象的属性列操作,不要直接碰几何列。
举个错误与正确写法的对比:
# 错误用法:用ddply处理sf对象(会触发报错) library(plyr) line_stats <- ddply(line_data, .(line_category), summarise, total_length = st_length(geometry))
# 正确用法:用dplyr处理sf对象 library(dplyr) line_stats <- line_data %>% group_by(line_category) %>% mutate(total_length = st_length(geometry)) %>% ungroup()
替换后就能避免plyr与sf不兼容导致的报错了。
额外优化小贴士
如果需要让线图例更美观,还可以通过guide_legend()的keywidth参数调整图例宽度,让线条显示更清晰:
guides( color = guide_legend(override.aes = list(fill = NA), keywidth = 2), linetype = guide_legend(override.aes = list(fill = NA), keywidth = 2) )
内容的提问来源于stack exchange,提问作者C Sev
相关产品推荐
相关产品推荐

