如何从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
相关产品推荐
相关产品推荐

