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

