如何调整R中热图的单元格宽高比及显示方向以匹配原矩阵?
解决R中
heatmap()的两个问题:匹配矩阵比例与保持原矩阵方向 针对你遇到的两个问题,我来一步步给你解决:
1. 让热图比例与输入矩阵一致(单元格为正方形)
原生的heatmap()函数默认会把热图拉伸到当前绘图区域的大小,所以矩形矩阵会被强制变成方形。要让单元格保持正方形,关键是让绘图区域的宽高比和矩阵的列数/行数匹配(因为每个单元格的宽高要相等,总宽度=列数×单元格宽度,总高度=行数×单元格高度)。
方法1:设置绘图设备的宽高(适合导出图片)
先获取矩阵的行列数,然后按比例设置绘图设备的宽高,比如:
# 以mtcars为例 data(mtcars) nr <- nrow(mtcars) # 32行 nc <- ncol(mtcars) # 11列 # 导出为png,每个单元格用100像素(可根据需求调整) png("mtcars_heatmap.png", width = nc * 100, height = nr * 100) heatmap(as.matrix(mtcars), scale = "none", Rowv = NA, Colv = NA, margins = c(5, 8)) dev.off()
这样生成的图片里,每个单元格都是标准的正方形,整体比例和原矩阵一致。
方法2:调整交互式绘图窗口的比例(适合RStudio实时查看)
用par()的pin参数设置绘图区域的宽高,比例同样是列数/行数:
par(pin = c(nc * 0.1, nr * 0.1)) # 0.1是每个单元格的英寸大小,可调整 heatmap(as.matrix(mtcars), scale = "none", Rowv = NA, Colv = NA)
执行后,绘图窗口里的热图就会和原矩阵比例匹配了。
2. 调整热图方向,让左上角对应原矩阵的左上角
heatmap()函数默认会把行的顺序反转绘制(原矩阵的第一行会出现在热图的最底部),这就是你看到左上角是"Volvo 142E"的原因。要让行顺序和原矩阵一致,只需要在传入矩阵时反转行的顺序即可:
# 反转行的索引,让原矩阵第一行成为热图的第一行(最顶部) heatmap(as.matrix(mtcars[nrow(mtcars):1, ]), scale = "none", Rowv = NA, Colv = NA)
或者用rev()函数反转行名索引,效果一样:
heatmap(as.matrix(mtcars[rev(rownames(mtcars)), ]), scale = "none", Rowv = NA, Colv = NA)
这样热图的左上角就会对应原矩阵中"Mazda RX4"行和mpg列的单元格了,完全匹配原矩阵的方向。
结合两个需求的完整代码
把两个调整结合起来,针对你的641×976矩阵,代码可以写成:
# 假设你的数据是Data nr <- nrow(Data) nc <- ncol(Data) # 设置绘图设备宽高 png("custom_heatmap.png", width = nc * 50, height = nr * 50) # 50像素/单元格,可调整 heatmap(as.matrix(Data[nr:1, ]), scale = "none", col = my_palette, breaks = col_breaks, main = "Heatmap of emission ratios", Rowv = NA, Colv = NA, margins = c(6, 10)) dev.off()
内容的提问来源于stack exchange,提问作者stefx
相关产品推荐
相关产品推荐

