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

RStudio报错‘x’ must be a numeric matrix:经纬度热图绘制求助

问题解决:绘制经纬度×肠球菌浓度热图

报错原因

heatmap()函数要求第一个参数x必须是数值矩阵,你传入的是单个列的向量,不符合函数要求;同时Rowv/Colv参数是用于控制行/列聚类逻辑的,不能直接传入经纬度作为行和列标识。

解决方案

要实现“经度为行、纬度为列、热色代表浓度”的热图,需要先把长格式的原始数据转换为宽格式矩阵,再进行绘图,步骤如下:

1. 处理数据(去重/聚合)

如果数据中有重复的经纬度组合,先对同一位置的浓度值做聚合(比如取均值):

library(tidyverse)

# 聚合重复经纬度的浓度值
bacteria_clean <- bacteria_data %>%
  group_by(Longitude, Latitude) %>%
  summarise(Enterococci = mean(Enterococci..cfu.100ml., na.rm = TRUE), .groups = "drop")

2. 转换为宽格式矩阵

将长格式数据转为“行=经度,列=纬度,值=浓度”的矩阵:

# 转换为宽格式并转为矩阵
bacteria_matrix <- bacteria_clean %>%
  pivot_wider(names_from = Latitude, values_from = Enterococci, values_fill = 0) %>% # 用0填充缺失值
  column_to_rownames(var = "Longitude") %>%
  as.matrix()

3. 绘制热图

用基础包heatmap:

heatmap(bacteria_matrix, 
        main = "肠球菌浓度热图(经度×纬度)",
        xlab = "纬度",
        ylab = "经度",
        col = heat.colors(20), # 热色系配色
        Rowv = NA, Colv = NA) # 关闭聚类,直接按经纬度顺序展示

用更灵活的pheatmap(推荐):

首次使用先安装包:

install.packages("pheatmap")

绘制代码:

library(pheatmap)
pheatmap(bacteria_matrix,
         main = "肠球菌浓度热图(经度×纬度)",
         xlab = "纬度",
         ylab = "经度",
         color = heat.colors(20),
         cluster_rows = FALSE, # 关闭行聚类
         cluster_cols = FALSE) # 关闭列聚类

补充说明

  • 如果不想用tidyverse,也可以用基础包的reshape2::dcast来转换宽格式:
library(reshape2)
bacteria_matrix <- dcast(bacteria_clean, Longitude ~ Latitude, value.var = "Enterococci", fill = 0) %>%
  column_to_rownames(var = "Longitude") %>%
  as.matrix()
  • 若缺失值不想用0填充,可以改为mean(Enterococci, na.rm = TRUE)或者其他合理值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:35:24