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

在R语言中复刻Excel等高线图:基于点位与计数数据

在R中制作多变量分层等高线图(适配样带点位数据)

核心思路

你的需求是将离散样带点位的计数数据转换为连续等高线图,同时支持多变量分层展示。ggplot2本身不直接支持离散点生成等高线,需要先对离散数据做网格插值,再用等高线图层实现,配合分面功能完成多变量展示。

步骤1:数据准备与格式转换

首先把样带点位(如A1、B3这类标识)拆分为x/y坐标,同时将宽格式数据(多变量列)转为长格式,方便后续分面。

模拟示例数据

library(tidyverse)
library(akima) # 用于插值

# 模拟样带点位数据:字母为y轴,数字为x轴,两个变量:食源树利用、总到访次数
set.seed(123)
sample_data <- expand.grid(
  y = LETTERS[1:5],
  x = 1:5
) %>%
  mutate(
    食源树利用 = sample(1:20, nrow(.), replace = TRUE),
    总到访次数 = sample(5:30, nrow(.), replace = TRUE)
  ) %>%
  # 把字母y转为数值坐标
  mutate(y_num = as.numeric(factor(y, levels = LETTERS[1:5])))

步骤2:对离散数据做网格插值

因为等高线需要连续的网格数据,用akima::interp对每个变量分别插值,再整合为长格式:

# 定义插值函数
interp_var <- function(data, var_name) {
  interp_result <- interp(
    x = data$x,
    y = data$y_num,
    z = data[[var_name]],
    nx = 50, ny = 50 # 插值后的网格精度,数值越高越平滑
  )
  # 转换为ggplot可用的数据框
  as.data.frame(interp_result) %>%
    rename(z = !!var_name) %>%
    mutate(variable = var_name)
}

# 对两个变量分别插值并合并
interpolated_data <- bind_rows(
  interp_var(sample_data, "食源树利用"),
  interp_var(sample_data, "总到访次数")
)

步骤3:绘制多变量分层等高线图

用ggplot2的geom_contour_filled(填充式等高线)或geom_contour(线条式),配合facet_wrap实现多变量分面展示:

填充式等高线图(类似Excel的填充效果)

ggplot(interpolated_data, aes(x = x, y = y)) +
  geom_contour_filled(aes(z = z), bins = 8) + # bins控制等高线层级数量
  # 可选:添加原始点位标记
  geom_point(data = sample_data, aes(x = x, y = y_num), color = "black", size = 2) +
  # 分面展示不同变量
  facet_wrap(~variable, ncol = 2) +
  # 还原y轴的字母标签
  scale_y_continuous(breaks = 1:5, labels = LETTERS[1:5]) +
  labs(x = "样带数字标识", y = "样带字母标识") +
  theme_minimal()

线条式等高线图(带数值标注)

如果需要类似Excel的线条+标注效果,可以用geom_contour配合geom_text_contour:

ggplot(interpolated_data, aes(x = x, y = y)) +
  geom_contour(aes(z = z, color = after_stat(level)), bins = 8) +
  geom_text_contour(aes(z = z), color = "black", size = 3) +
  geom_point(data = sample_data, aes(x = x, y = y_num), color = "red", size = 2) +
  facet_wrap(~variable, ncol = 2) +
  scale_y_continuous(breaks = 1:5, labels = LETTERS[1:5]) +
  scale_color_viridis_c() +
  labs(x = "样带数字标识", y = "样带字母标识", color = "计数") +
  theme_minimal()

关键说明

  • 为什么geom_tile不符合需求?geom_tile是离散热图,只能展示每个点位的数值,无法生成连续的等高线过渡效果,而插值+等高线图层能实现类似Excel的平滑等高线。
  • 插值精度可通过nx/ny调整,数值越大等高线越平滑,但计算量也会增加。
  • 若你的原始数据已经是矩阵格式,可直接将矩阵转换为x/y/z的长格式后进行插值,无需拆分点位标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:45:06