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

如何从ggplot2::geom_density_2d_filled生成的ggplot对象中获取等高线的x、y、z数据?

获取ggplot2热力图(geom_density_2d_filled)的等高线信息

当然可以提取这些数据!下面分两种场景给你具体的解决方案:

1. 从已有的ggplot对象中提取等高线数据

如果你已经有了示例中那样的gg对象,可以通过ggplot_build()函数获取ggplot内部计算好的图层数据,这其中就包含了等高线的所有顶点信息:

library(tidyverse)

# 你的示例代码
gg <- ggplot(mtcars) + 
  geom_density_2d_filled(aes(x = mpg, y = disp)) + 
  theme(legend.position = "none")

# 获取构建后的ggplot数据结构
gg_build <- ggplot_build(gg)

# 提取密度2d图层的计算数据(第一个图层就是geom_density_2d_filled)
density_contour_data <- gg_build$data[[1]]

# 查看数据结构,包含x/y坐标、对应的密度等级(level)、填充分组等
head(density_contour_data)

这个数据框里的每一行代表等高线多边形的一个顶点,level列对应密度的分位数区间,x和y是顶点坐标。如果你需要整理成更结构化的格式,可以按level分组提取每个等高线的边界。

2. 生成类似MASS::kde2d的x/y/z网格数据

如果你想要和MASS::kde2d输出格式完全一致的密度网格数据(x轴网格、y轴网格、密度矩阵z),可以直接调用MASS::kde2d——这其实就是geom_density_2d_filled背后默认使用的密度计算函数:

library(MASS)

# 计算密度网格,n控制网格精度(ggplot默认n=100)
kde_output <- kde2d(
  x = mtcars$mpg, 
  y = mtcars$disp, 
  n = 100,
  # 如果你想和ggplot的结果完全匹配,使用ggplot默认的带宽计算方式
  bw = c(bw.nrd0(mtcars$mpg), bw.nrd0(mtcars$disp))
)

# 查看结果结构:x是x轴网格向量,y是y轴网格向量,z是n×n的密度矩阵
str(kde_output)

如果需要验证和ggplot的一致性,可以基于这个kde_output重新绘制热力图,会和你原来的gg对象完全一致。

补充说明

  • geom_density_2d_filled本质上是通过stat_density_2d计算密度,然后生成填充的等高线多边形。所以无论是从已有的ggplot对象提取,还是直接调用底层函数,都能拿到你需要的等高线/密度数据。
  • 如果需要调整密度计算的参数(比如带宽、网格数),可以在geom_density_2d_filled里通过stat_params传递,或者直接在kde2d中设置对应的参数。

内容的提问来源于stack exchange,提问作者drastega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:47:46