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

RShiny中用ggplot2绘制分级统计图报错:lat * pi参数非数值

RShiny ggplot2绘图错误排查与解决

问题描述

在RShiny应用中,合并空间数据框与用户上传的垃圾数据后,使用ggplot2绘制mean_plastics分级统计图时触发以下错误:

Warning: Error in geom_polygon: Problem while converting geom to grob.
ℹ Error occurred in the 1st layer.
Caused by error in `lat * pi`:
! non-numeric argument to binary operator

怀疑问题出在output$plot代码块中,需针对该错误进行修复。

错误核心原因

该错误本质是空间数据的坐标列(lat/long)被识别为非数值类型,导致ggplot2在处理geom_polygon时无法完成坐标转换计算。以下是具体排查和修复方案:

1. 检查并转换坐标列类型

在output$plot代码块开头添加类型检查,确认坐标列是否为数值型:

# 打印坐标列类型,排查问题
print(class(merged_data$lat))
print(class(merged_data$lon))

若输出为character,需将其转换为数值型:

merged_data$lat <- as.numeric(merged_data$lat)
merged_data$lon <- as.numeric(merged_data$lon)

2. 改用geom_sf()简化空间绘图

如果使用的是sf格式的空间数据框,直接用geom_sf()替代geom_polygon(),可避免手动处理坐标转换的问题:

output$plot <- renderPlot({
  # 合并sf空间数据与上传数据
  merged_sf <- merge(spatial_sf, uploaded_data, by = "匹配列名")
  
  ggplot(merged_sf) +
    geom_sf(aes(fill = mean_plastics)) +
    scale_fill_viridis_c(option = "plasma", name = "塑料均值") +
    theme_minimal()
})

3. 规范上传数据的读取类型

用户上传的垃圾数据可能在导入时被错误解析,读取时指定列类型可避免类型丢失:

uploaded_data <- read.csv(input$file, colClasses = c("匹配列名" = "character", "mean_plastics" = "numeric"))

4. 清理坐标列的异常值

若坐标列存在NA或非数值字符,转换时会失败,需先清理数据:

merged_data <- merged_data %>%
  dplyr::filter(!is.na(lat), !is.na(lon)) %>%
  dplyr::mutate(lat = as.numeric(lat), lon = as.numeric(lon))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:47:53