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

