如何用ggplot2绘制类似filled.contour的填充等高线图
用ggplot2绘制填充等高线图的问题解决方法
问题原因
你用stat_contour得到空图的核心原因是:你的数据是非规则分布的散点数据,而ggplot2的等高线相关函数(包括stat_contour)需要基于规则网格数据才能生成有效的等高线/填充效果,直接传入散点数据无法完成等高线计算,因此输出空图。而filled.contour能正常工作是因为你先用akima::interp完成了散点到规则网格的插值。
数据准备建议
和filled.contour的逻辑一致,需要先将散点数据插值为规则网格数据,再转换为ggplot2要求的长格式(tidy)数据框:
- 使用
akima::interp对x、y、z进行插值,生成规则网格的x、y坐标矩阵和对应的z值矩阵 - 将插值后的网格数据转换为每行对应一个(x,y,z)观测的长格式数据框
示例代码:
library(akima) library(ggplot2) library(tidyr) # 对原始散点数据进行插值,生成规则网格 fld <- with(df, interp(x = x, y = y, z = z)) # 将网格数据转换为tidy格式数据框 interp_df <- expand.grid(x = fld$x, y = fld$y) interp_df$z <- as.vector(fld$z)
ggplot2实现填充等高线的两种方法
方法1:用geom_raster实现平滑填充(与filled.contour效果一致)
这种方法直接基于插值后的网格绘制颜色填充,通过interpolate = TRUE让颜色过渡更平滑,视觉效果和filled.contour高度相似:
ggplot(interp_df, aes(x = x, y = y, fill = z)) + geom_raster(interpolate = TRUE) + # 使用与filled.contour默认类似的配色 scale_fill_gradientn(colours = terrain.colors(10)) + labs(x = "x", y = "y", fill = "z") + theme_bw()
方法2:用stat_contour_fill绘制带边界的填充等高线
如果需要明确的等高线边界,可以使用ggplot2 3.3.0及以上版本支持的stat_contour_fill函数,它会自动计算等高线并填充颜色:
ggplot(interp_df, aes(x = x, y = y, z = z)) + stat_contour_fill(aes(fill = after_stat(level))) + scale_fill_gradientn(colours = terrain.colors(10)) + labs(x = "x", y = "y", fill = "z") + theme_bw()
额外注意事项
- 如果插值后出现缺失值,可以在
interp函数中添加extrapolate = TRUE参数进行外插,或者用na.omit(interp_df)剔除缺失值 - 若需要调整等高线的数量,可以在
stat_contour_fill中添加bins参数(如bins = 15)来控制分级数
内容的提问来源于stack exchange,提问作者imtaiky
相关产品推荐
相关产品推荐

