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

使用curvilinear grid时geom_stars绘图失败问题求助

在曲线网格(Curvilinear Grid)上使用stars包绘制热力图时的 tibble 尺寸不兼容错误解决

错误原因

你遇到的错误本质是**geom_stars当前版本的实现无法直接处理曲线网格类型的stars对象**——它内部调用dplyr::as_tibble转换数据时,曲线网格的特殊结构(包含2个维度的坐标矩阵)和栅格值的一维展开结构(16个元素)出现列尺寸不匹配,触发tibble的兼容检查错误。

解决方法

方法1:使用stars原生绘图函数(最简便)

stars包的plot()函数原生支持曲线网格,无需依赖ggplot2的geom_stars:

library(stars)   
library(ggplot2)

# 构造原始数据
lng <- rbind(c(-2.099361, -2.098536, -2.097710, -2.096885),
             c(-2.099350, -2.098525, -2.097699, -2.096874), 
             c(-2.099339, -2.098514, -2.097688, -2.096863), 
             c(-2.099328, -2.098503, -2.097677, -2.096852))

lat <- rbind(c(57.10963, 57.10963, 57.10962, 57.10962), 
             c(57.11008, 57.11008, 57.11007, 57.11007),
             c(57.11053, 57.11053, 57.11052, 57.11051), 
             c(57.11098, 57.11098, 57.11097, 57.11096))

arr <- rbind(1:4, 5:8, 9:12, 13:16)

# 创建曲线网格stars对象
arr_star <- st_as_stars(arr, curvilinear = list(west_east = lng, south_north = lat))

# 原生绘制
plot(arr_star, alpha = 0.75)

方法2:手动转换为长格式后用ggplot2绘制

如果必须使用ggplot2,可以用as.data.frame()将曲线网格对象转换为长格式tibble,再用geom_tile()实现热力图:

# 转换为包含坐标和值的长格式数据框
arr_df <- as.data.frame(arr_star, xy = TRUE)

# ggplot2绘图
ggplot(arr_df, aes(x = west_east, y = south_north, fill = X)) +
  geom_tile(alpha = 0.75) +
  coord_equal() +  # 保持坐标比例
  scale_fill_viridis_c()  # 可选:使用更美观的配色

说明

as.data.frame(arr_star, xy = TRUE)会自动将曲线网格的二维坐标矩阵展开为一维的坐标列,同时匹配对应的栅格值,生成每一行对应一个栅格单元的长格式数据,完美适配ggplot2的绘图逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:15:42