使用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
相关产品推荐
相关产品推荐

