You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2绘制类似filled.contour的填充等高线图

用ggplot2绘制填充等高线图的问题解决方法

问题原因

你用stat_contour得到空图的核心原因是:你的数据是非规则分布的散点数据,而ggplot2的等高线相关函数(包括stat_contour)需要基于规则网格数据才能生成有效的等高线/填充效果,直接传入散点数据无法完成等高线计算,因此输出空图。而filled.contour能正常工作是因为你先用akima::interp完成了散点到规则网格的插值。

数据准备建议

和filled.contour的逻辑一致,需要先将散点数据插值为规则网格数据,再转换为ggplot2要求的长格式(tidy)数据框:

  1. 使用akima::interp对x、y、z进行插值,生成规则网格的x、y坐标矩阵和对应的z值矩阵
  2. 将插值后的网格数据转换为每行对应一个(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:12:33