ggplot二维facet_grid使用geom_polygon报错 一维场景正常
问题描述
使用ggplot绘制相关性与主成分(PC)的对应关系时,尝试为二维facet_grid分面图添加州级地图边界。一维分面场景下代码可正常运行,但二维场景下运行失败,暂未定位问题原因,初步推测可能是facet_grid存在相关功能限制,更大概率是对其运行机制理解不到位。
运行代码及报错信息
ggplot(A0G, aes(Longitude, Latitude, color=Correlation)) + geom_point(size=2*abs(A0G$Correlation)) + geom_polygon(data = ca_df, aes(x=Longitude, y=Latitude, fill = NA, color = "black")) + facet_grid(rows=vars(A0G$Lag), cols=vars(A0G$PC))
报错输出:
Error in `$<-.data.frame`(`*tmp*`, "PANEL", value = c(4L, 3L, 5L, 10L, : replacement has 11112 rows, data has 516
已确认的数据维度信息
初步推测问题与地图数据框ca_df、主绘图数据框A0G的维度差异有关,但一维场景下代码可正常运行,暂未理清问题根源,两个数据框维度如下:
dim(ca_df)
[1] 516 6
dim(A0G)
[1] 11112 18
问题原因与解决方案
报错根源
报错核心原因是分面函数中直接使用A0G$Lag、A0G$PC这种全局索引列的写法,不符合ggplot的数据映射规则。当图层使用和主数据行数不一致的独立数据源(此处为516行的ca_df)时,ggplot会尝试将分面变量匹配到所有图层的数据上,全局索引的写法会直接传入长度为11112的分面向量,强行匹配到516行的ca_df时就会触发长度不匹配错误。一维分面能运行属于写法不规范导致的巧合,本质是代码存在潜在漏洞。
修复方法
- 首先删除
facet_grid内所有A0G$前缀,分面参数直接传入裸列名即可,ggplot会自动从对应图层的数据源中匹配列名,主数据A0G本身包含Lag和PC列,无需额外加数据框索引:# 错误写法 # facet_grid(rows=vars(A0G$Lag), cols=vars(A0G$PC)) # 正确写法 facet_grid(rows=vars(Lag), cols=vars(PC)) - 州界数据
ca_df需要在所有分面中重复渲染,因此要在geom_polygon中添加inherit.aes = FALSE参数,避免继承主数据的全局映射规则;同时固定属性(此处为fill = NA、color = "black")不要写在aes()映射内部,要放在外层作为固定参数传入:geom_polygon( data = ca_df, aes(x=Longitude, y=Latitude), fill = NA, color = "black", inherit.aes = FALSE ) - 同理
geom_point中的size映射也不要直接调用A0G$Correlation,将映射规则写入aes()内使用裸列名即可,避免后续出现同类数据源不匹配问题。
修复后完整代码
ggplot(A0G, aes(Longitude, Latitude, color=Correlation)) + geom_point(aes(size=2*abs(Correlation))) + geom_polygon( data = ca_df, aes(x=Longitude, y=Latitude), fill = NA, color = "black", inherit.aes = FALSE ) + facet_grid(rows=vars(Lag), cols=vars(PC))
内容的提问来源于stack exchange,提问作者user74236
相关产品推荐
相关产品推荐

