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

如何在R中结合metR与gratia或ggplot2为等高线添加标签?

为等高线图添加标签的几种方法

1. 加载所需R包

# 加载包
library('mgcv')
library('gratia') # 用于draw()和smooth_estimates()函数
library('metR') # 用于geom_contour2()和geom_text_contour()函数
library('ggplot2')

2. 准备模拟数据

使用Gavin Simpson的示例模拟数据:

set.seed(1)
dat <- gamSim(2, n = 4000, dist = "normal", scale = 1, verbose = FALSE)
mod <- gam(y ~ s(x, z, k = 30), data = dat$data, method = "REML")
sm <- smooth_estimates(mod); sm

3. 方法一:用gratia自动调整等高线并添加标签

直接借助gratia的draw()函数绘制等高线,再用metR的geom_text_contour()添加标签:

draw(mod) +
  geom_text_contour( 
    aes(z = est), # 'est'来自smooth_estimates(mod)的结果
    colour = "black", size = 4.5, fontface = "bold",
    stroke = 0.3, stroke.colour = "white", # 'stroke'控制文本描边宽度与文本尺寸的相对比例
    skip = 0, # 设置跳过的等高线数量,0表示每条都加标签
    rotate = FALSE, # 标签水平显示;设为TRUE时标签会随等高线旋转
    label.placer = label_placer_fraction(frac = 0.5)) # 'frac = 0.5'将标签放在等高线两端等距位置,也可以尝试label_placer_n(2)实现每条等高线显示两个标签

自动调整等高线的标签效果

注意:如果在draw()中指定n_contour = 10,会出现等高线和标签不匹配的问题。要解决这个问题,需要在draw()中设置n_contour = 0,然后手动用geom_contour2()定义等高线的binwidth,同时在geom_text_contour()中设置对应的breaks。

4. 方法二:用gratia手动控制等高线参数并添加标签

先查看est的极值来确定z轴范围,再手动定义等高线参数:

min(sm$est); max(sm$est) # 查看'est'的最小值和最大值,用于调整z轴范围
draw(mod, n_contour = 0) +
  geom_contour2(aes(z = est), binwidth = 0.2) +
  geom_text_contour(
    aes(z = est), # 'est'来自smooth_estimates(mod)的结果
    breaks = seq(-0.4, 0.4, by = 0.2), # 'breaks'必须和上方的'binwidth'匹配
    colour = "black", size = 4.5, fontface = "bold",
    stroke = 0.3, stroke.colour = "white", # 'stroke'控制文本描边宽度与文本尺寸的相对比例
    skip = 0, # 设置跳过的等高线数量,0表示每条都加标签
    rotate = FALSE, # 标签水平显示;设为TRUE时标签会随等高线旋转
    label.placer = label_placer_fraction(frac = 0.5)) # 'frac = 0.5'将标签放在等高线两端等距位置,也可以尝试label_placer_n(2)实现每条等高线显示两个标签

手动控制等高线的标签效果

5. 方法三:直接用ggplot2自定义图形并添加标签

跳过gratia的draw(),直接用ggplot2构建图形,灵活控制所有参数:

ggplot(data = sm, aes(x = x, y = z, z = est)) +
  geom_contour2(aes(z = est), binwidth = 0.1) +
  geom_text_contour(
    aes(z = est), # 'est'来自smooth_estimates(mod)的结果
    breaks = seq(-0.4, 0.4, by = 0.1), # 用'breaks'而非'bins'避免出现过多小数
    colour = "black", size = 4.5, fontface = "bold",
    stroke = 0.3, stroke.colour = "white", # 'stroke'控制文本描边宽度与文本尺寸的相对比例
    skip = 0, # 设置跳过的等高线数量,0表示每条都加标签
    rotate = FALSE, # 标签水平显示;设为TRUE时标签会随等高线旋转
    label.placer = label_placer_fraction(frac = 0.5)) # 'frac = 0.5'将标签放在等高线两端等距位置,也可以尝试label_placer_n(2)实现每条等高线显示两个标签

ggplot2自定义的等高线标签效果


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:45:25