R语言ggplot2绘制热力图报错object 'X1' is not found如何解决
ggplot2绘制热力图报
object 'X1' is not found的修复方案 问题场景
现有如下结构的数据框df,需要绘制热力图,用不同颜色方块展示数值,要求数值越高对应方块颜色越深:
team_1 team_2 team_3 very_effective 3 5 8 effective 5 6 9 ineffective 6 8 20
运行如下代码时触发object 'X1' is not found报错:
library(ggplot2) ggp <- ggplot(df, aes(X1, X2)) + geom_tile() ggp
报错原因
报错核心来自两个问题:
aes()内引用的X1、X2并不是df中存在的列名,R无法在数据框里匹配到对应变量geom_tile()绘制热力图要求输入为长格式数据,当前df是宽格式:行索引为效果等级,列名为团队分组,没有单独拆分出x轴维度、y轴维度、填充数值三个绘图必须的字段,无法直接用于绘图。
修复方法
按如下步骤调整即可:
- 先将数据框的行名转为独立的效果等级列,再把宽格式的team列转换为长格式,最终得到包含
effect_level(效果等级,对应y轴)、team(团队,对应x轴)、score(数值,对应颜色填充)三列的长表 - 在
aes()中正确映射三个绘图属性,补充填充值的映射逻辑 - 可根据需求调整坐标轴顺序、配色规则,保证数值越高方块颜色越深
完整可运行代码如下:
library(ggplot2) library(tidyr) library(tibble) # 构造示例df df <- data.frame( row.names = c("very_effective", "effective", "ineffective"), team_1 = c(3, 5, 6), team_2 = c(5, 6, 8), team_3 = c(8, 9, 20) ) # 宽转长,适配ggplot2输入要求 df_long <- df |> rownames_to_column(var = "effect_level") |> pivot_longer(cols = starts_with("team_"), names_to = "team", values_to = "score") # 绘制热力图 ggp <- ggplot(df_long, aes(x = team, y = effect_level, fill = score)) + geom_tile(color = "white") + # 加白色边框区分方块 # 固定y轴顺序,从高效果到低效果排列 scale_y_discrete(limits = c("very_effective", "effective", "ineffective")) + # 设置配色,数值越高颜色越深 scale_fill_gradient(low = "#f7fbff", high = "#08306b") ggp
内容的提问来源于stack exchange,提问作者CheckThis
相关产品推荐
相关产品推荐

