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

