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

如何让R绘制的热图保留数据框的原始顺序?

让R热图沿用数据框原始顺序的解决方法

不管你用ggplot2还是pheatmap这类常用热图工具,默认都会搞字母排序甚至聚类排序,要保住原始顺序,按下面的方法来:

用ggplot2画热图的情况

ggplot2会自动把字符型的行/列名转成无序列因子,排序时就按字母来。要改的话,直接把对应的列转成有序因子,把数据框的原始顺序设为因子水平就行:

# 假设你的数据框叫df,存分组的列是"type",对应tension、cluster这类分组
df$type <- factor(df$type, levels = unique(df$type), ordered = TRUE)

# 然后正常绘制热图
library(ggplot2)
ggplot(df, aes(x = 你的列名, y = type, fill = 数值列名)) +
  geom_tile()

unique(df$type)会自动提取数据框里分组的原始出现顺序,把它设为因子水平后,ggplot就会按这个顺序排列了。

用pheatmap画热图的情况

pheatmap默认不仅会做聚类排序,就算关掉聚类也会按字母排序。要保留原始顺序,得同时关闭聚类+指定行/列顺序:

library(pheatmap)
# 先把数据转成矩阵(去掉分组列,只保留数值列)
mat <- as.matrix(df[, -which(names(df) == "type")])
# 将分组名设为矩阵行名
rownames(mat) <- df$type

# 绘制热图时指定关键参数
pheatmap(mat,
         cluster_rows = FALSE, # 关闭行聚类
         cluster_cols = FALSE, # 关闭列聚类(按需选择)
         row_order = rownames(mat) # 强制行顺序沿用原始行名的顺序
)

如果你的行顺序本来就是数据框的行号顺序,用row_order = 1:nrow(mat)也能达到同样效果。

核心逻辑

R处理分类变量时,字符型默认会被当成无序列因子,排序规则是字母顺序。所以要么提前把分类变量转成指定好水平顺序的因子,要么在绘图函数里直接强制指定排列顺序,就能覆盖默认的排序规则了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:05:02