Gee*_*cid 26 label r data-visualization heatmap lattice
在R中创建热图已成为许多帖子,讨论和迭代的主题.我的主要问题是将格子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 = "")
Run Code Online (Sandbox Code Playgroud)
您可以使用levelplot()
以下方法轻松更改方向到对角
require(lattice)
levelplot(d, scale=list(x=list(rot=45)))
Run Code Online (Sandbox Code Playgroud)
但应用聚类似乎很痛苦.其他视觉选项也是如此,例如在热图单元格周围添加边框.
现在,转移到实际的heatmap()
相关功能,聚类和所有基本视觉效果都非常简单 - 几乎不需要调整:
heatmap(d)
Run Code Online (Sandbox Code Playgroud)
所以在这里:
require(gplots)
heatmap.2(d, key=F)
Run Code Online (Sandbox Code Playgroud)
最后,我最喜欢的一个:
require(pheatmap)
pheatmap(d)
Run Code Online (Sandbox Code Playgroud)
但所有这些都无法旋转标签.手册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)
Run Code Online (Sandbox Code Playgroud)
那么我该怎么做才能获得理想的,快速的热图,具有聚类和方向以及良好的视觉功能黑客攻击?我的最佳出价正在改变heatmap()
或者pheatmap()
不知何故,因为这两者似乎是调整中最通用的.但欢迎任何解决方案.
Jos*_*ien 19
要修复pheatmap
,你真正想做的就是pheatmap:::draw_colnames
在调用中调整几个设置grid.text()
.这是使用的一种方法assignInNamespace()
.(它可能需要额外的调整,但你得到了图片;):
library(grid) ## Need to attach (and not just load) grid package
library(pheatmap)
## Your data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
## Edit body of pheatmap:::draw_colnames, customizing it to your liking
draw_colnames_45 <- function (coln, ...) {
m = length(coln)
x = (1:m)/m - 1/2/m
grid.text(coln, x = x, y = unit(0.96, "npc"), vjust = .5,
hjust = 1, rot = 45, gp = gpar(...)) ## Was 'hjust=0' and 'rot=270'
}
## For pheatmap_1.0.8 and later:
draw_colnames_45 <- function (coln, gaps, ...) {
coord = pheatmap:::find_coordinates(length(coln), gaps)
x = coord$coord - 0.5 * coord$size
res = textGrob(coln, x = x, y = unit(1, "npc") - unit(3,"bigpts"), vjust = 0.5, hjust = 1, rot = 45, gp = gpar(...))
return(res)}
## 'Overwrite' default draw_colnames with your own version
assignInNamespace(x="draw_colnames", value="draw_colnames_45",
ns=asNamespace("pheatmap"))
## Try it out
pheatmap(d)
Run Code Online (Sandbox Code Playgroud)
它比我的评论假设要复杂一点,因为heatmap
为了绘制树形图而打破绘图区域,最后的绘图区域不是image
您想要附加标签的图.
有一个解决方案虽然heatmap
提供了一个add.expr
参数,它在image
绘制时计算表达式.人们还需要知道由于树状图排序而发生的标签的重新排序.最后一点涉及一些不优雅的黑客攻击,因为我将首先绘制热图以获取重新排序信息,然后使用它来正确地绘制热像图.
首先是一个例子 ?heatmap
x <- as.matrix(mtcars)
rc <- rainbow(nrow(x), start = 0, end = .3)
cc <- rainbow(ncol(x), start = 0, end = .3)
hv <- heatmap(x, col = cm.colors(256), scale = "column",
RowSideColors = rc, ColSideColors = cc, margins = c(5,10),
xlab = "specification variables", ylab = "Car Models",
main = "heatmap(<Mtcars data>, ..., scale = \"column\")")
Run Code Online (Sandbox Code Playgroud)
在这个阶段,标签是不是我们想要他们,但是hv
包含了我们需要重新排序信息colnames
的mtcars
在其组件$colInd
:
> hv$colInd
[1] 2 9 8 11 6 5 10 7 1 4 3
Run Code Online (Sandbox Code Playgroud)
你使用它就像你输出的那样order
:
> colnames(mtcars)[hv$colInd]
[1] "cyl" "am" "vs" "carb" "wt" "drat" "gear" "qsec" "mpg" "hp"
[11] "disp"
Run Code Online (Sandbox Code Playgroud)
现在使用它以正确的顺序生成我们想要的标签:
labs <- colnames(mtcars)[hv$colInd]
Run Code Online (Sandbox Code Playgroud)
然后我们重新调用,heatmap
但这次我们指定labCol = ""
抑制列变量的标记(使用零长度字符串).我们还使用调用以text
所需角度绘制标签.电话text
是:
text(x = seq_along(labs), y = -0.2, srt = 45, labels = labs, xpd = TRUE)
Run Code Online (Sandbox Code Playgroud)
这基本上就是你在问题中所拥有的.使用y
您需要的值进行播放,将其调整为字符串的长度,以使标签不与image
图形重叠.我们指定labels = labs
按所需顺序传入我们想要的标签.整个text
电话会被传递给不加add.expr
引号.这是整个电话:
hv <- heatmap(x, col = cm.colors(256), scale = "column",
RowSideColors = rc, ColSideColors = cc, margins = c(5,10),
xlab = "specification variables", ylab = "Car Models",
labCol = "",
main = "heatmap(<Mtcars data>, ..., scale = \"column\")",
add.expr = text(x = seq_along(labs), y = -0.2, srt = 45,
labels = labs, xpd = TRUE))
Run Code Online (Sandbox Code Playgroud)
结果如下:
小智 7
我也在寻找用heatmap旋转标签文本的方法.最终我设法找到了这个解决方案:
library(gplots)
library(RColorBrewer)
heatmap.2(x,col=rev(brewer.pal(11,"Spectral")),cexRow=1,cexCol=1,margins=c(12,8),trace="none",srtCol=45)
Run Code Online (Sandbox Code Playgroud)
关键参数是srtCol(or srtRow for row labels)
,用于在gplots中旋转列标签.
2019 年 1 月 4 日发布的最新版本pheatmap
(1.0.12)支持此参数。angle_col
#example data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
#update to latest version on CRAN
install.packages("pheatmap")
library("pheatmap")
pheatmap(d, angle_col = 45)
Run Code Online (Sandbox Code Playgroud)
我在 GitHub 上创建了一个包,其中包含该heatmap.2
函数的改进版本。这支持调整轴标签,包括srtCol
传递给axis
函数的参数。它可以从以下位置安装:https : //github.com/TomKellyGenetics/heatmap.2x
library("devtools")
install_github("TomKellyGenetics/heatmap.2x")
library("heatmap.2x")
heatmap.2x(d, scale = "none", trace = "none", col = heat.colors, srtCol = 45)
Run Code Online (Sandbox Code Playgroud)
从 的2.12.1 版本开始gplots
,该heatmap.2
函数还支持该srtCol
参数。
library("gplots")
heatmap.2(d, scale = "none", trace = "none", srtCol = 45)
Run Code Online (Sandbox Code Playgroud)
使用lattice::levelplot
和的解决方案latticeExtra::dendrogramGrob
:
library(lattice)
library(latticeExtra)
Run Code Online (Sandbox Code Playgroud)
示例数据:
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
Run Code Online (Sandbox Code Playgroud)
您必须定义行和列的树状图(在中内部计算heatmap
):
dd.row <- as.dendrogram(hclust(dist(d)))
row.ord <- order.dendrogram(dd.row)
dd.col <- as.dendrogram(hclust(dist(t(d))))
col.ord <- order.dendrogram(dd.col)
Run Code Online (Sandbox Code Playgroud)
并将它们传递给dendrogramGrob
的legend
参数levelplot
。
我已经定义了一个新的主题与来自色彩RColorBrewer
,和改性的细胞边界的宽度和颜色与border
和border.lwd
:
myTheme <- custom.theme(region=brewer.pal(n=11, 'RdBu'))
levelplot(d[row.ord, col.ord],
aspect = "fill", xlab='', ylab='',
scales = list(x = list(rot = 45)),
colorkey = list(space = "bottom"),
par.settings=myTheme,
border='black', border.lwd=.6,
legend =
list(right =
list(fun = dendrogramGrob,
args =
list(x = dd.col, ord = col.ord,
side = "right",
size = 10)),
top =
list(fun = dendrogramGrob,
args =
list(x = dd.row,
side = "top"))))
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用该shrink
参数按比例缩放像元大小。
levelplot(d[row.ord, col.ord],
aspect = "fill", xlab='', ylab='',
scales = list(x = list(rot = 45)),
colorkey = list(space = "bottom"),
par.settings=myTheme,
border='black', border.lwd=.6,
shrink=c(.75, .95),
legend =
list(right =
list(fun = dendrogramGrob,
args =
list(x = dd.col, ord = col.ord,
side = "right",
size = 10)),
top =
list(fun = dendrogramGrob,
args =
list(x = dd.row,
side = "top"))))
Run Code Online (Sandbox Code Playgroud)