【发布时间】:2013-03-08 11:43:24
【问题描述】:
在 R 中创建热图已成为许多帖子、讨论和迭代的主题。我的主要问题是,将 lattice levelplot() 或基本图形 image() 中可用解决方案的视觉灵活性与基本 heatmap()、pheatmap 的 pheatmap() 或 gplots 的 heatmap.2() 的轻松聚类相结合是很棘手的。这是我想要更改的一个小细节 - x 轴上标签的对角线方向。让我告诉你我在代码中的观点。
#example data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
您可以使用levelplot() 轻松将方向更改为对角线:
require(lattice)
levelplot(d, scale=list(x=list(rot=45)))
但应用聚类似乎很痛苦。其他视觉选项也是如此,例如在热图单元格周围添加边框。
现在,转移到实际的heatmap() 相关功能、聚类和所有基本视觉效果都非常简单——几乎不需要调整:
heatmap(d)
这里也是这样:
require(gplots)
heatmap.2(d, key=F)
最后,我最喜欢的一个:
require(pheatmap)
pheatmap(d)
但是所有这些都没有旋转标签的选项。 pheatmap 的手册建议我可以使用 grid.text 来定制我的标签。这是多么令人高兴——尤其是在聚类和更改显示标签的顺序时。除非我在这里遗漏了什么......
终于有一个老好image()了。我可以旋转标签,一般来说这是最可定制的解决方案,但没有集群选项。
image(1:nrow(d),1:ncol(d), d, axes=F, ylab="", xlab="")
text(1:ncol(d), 0, srt = 45, labels = rownames(d), xpd = TRUE)
axis(1, label=F)
axis(2, 1:nrow(d), colnames(d), las=1)
那么我应该怎么做才能获得理想的、快速的热图、集群和方向以及漂亮的视觉特征黑客?我的最佳出价是更改 heatmap() 或 pheatmap() 不知何故,因为这两个似乎在调整方面最通用。但欢迎任何解决方案。
【问题讨论】:
-
基础图形不允许您将刻度标签旋转到任意角度 --- 因此您必须使用在上一个
image示例中显示的text"hack" .我可能会将xaxt = FALSE传递给我的heatmap调用,然后添加不带标签的轴,然后使用text添加标签,就像使用image一样。 -
@GavinSimpson 这种方法的问题是,当您进行聚类时,您必须手动定义 x 轴上的标签顺序。可能,但有点痛苦。不过,感谢您向我指出
heatmap()是使用基本图形而不是网格构建的(我认为它是像pheatmap()这样的网格)。 -
有一个解决方案 - 我有一些工作,我只是写出来作为答案。这比我想象的要复杂一些。解决方案即将推出...
-
+1 既有趣又好问题。
标签: r label data-visualization heatmap lattice