ggplot2中如何为geom_density_2d生成的二维核密度图添加等高线标签
ggplot2 geom_density_2d等高线添加标签方法
有两种成熟的实现方案,不需要手动提取ggplot构建后的点集数据:
方案1:直接搭配metR包的geom_text_contour(最简方案)
geom_text_contour支持直接对接stat="density_2d"的统计结果,自动识别密度值生成标签,完整代码如下:
library(ggplot2) library(metR) library(sp) # 用于加载meuse数据集 # 加载数据 data("meuse") # 绘图 ggplot(meuse, aes(x=x, y=y)) + geom_density_2d() + # 直接添加等高线标签层 geom_text_contour( stat = "density_2d", aes(label = after_stat(level)), size = 3.5, stroke = 0.2, # 给标签添加白色描边,避免被等高线遮挡 skip = 1 # 每隔1条等高线添加标签,避免过密 )
方案2:预计算核密度网格再绘图(自定义程度更高)
如果需要自定义核密度计算参数,可以先手动计算二维核密度结果再绘图:
library(ggplot2) library(metR) library(MASS) library(sp) data("meuse") # 手动计算二维核密度网格 dens <- kde2d(meuse$x, meuse$y, n = 100) # n参数控制网格精度 # 转换为ggplot可识别的长数据框 dens_df <- expand.grid(x = dens$x, y = dens$y) dens_df$z <- as.vector(dens$z) # 绘图 ggplot(dens_df, aes(x = x, y = y, z = z)) + geom_contour() + geom_text_contour(aes(label = after_stat(level)))
常见问题说明
你之前尝试从ggplot_build提取的数据是已经拆分后的等高线顶点点集,不是geom_text_contour需要的连续网格数据,因此无法直接使用,直接对接统计层或者预计算网格即可规避这个问题。
内容的提问来源于stack exchange,提问作者Muon
相关产品推荐
相关产品推荐

