如何强制行标签固定宽度并在 R 中的 pheatmap 中对齐?
How to force the row labels in a fixed width and be aligned in pheatmap in R?
通常在 R 的 pheatmap 中显示行标签没有问题。但是,看到我有一点复杂的行标签,它们是组合了一个字符串的头部和另一个字符串的结尾的字符串。例如,"ABC**** 123".
这是一个例子和我的代码:
library(pheatmap)
library(stringr)
# create an example
test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
colnames(test) = paste("Test", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")
# make random pvalue to show at the end of rownames
random.pvalue <- formatC(runif(n = 20,min = 0.0000000000001,max = 0.00000000001),format = "e",
digits = 2)
# creat new rownames with fixed width
add.label <- paste0(str_pad(rownames(test),
width=12,
side="right"),
random.pvalue)
rownames(test) <- add.label # update rownames
# Draw heatmaps
pheatmap(test) # you could see the pvalues are not aligned
相信我,我通过在 R 中使用 formatC() 和 str_pad() 强制这些行标签的宽度固定。但是,当我将 pheatmap 与这些行标签一起使用时,标签没有显示为我想,他们像下面这样,你可以清楚地看到行标签没有对齐,即使它们具有相同的字符串宽度。
[1] "Gene1 7.77e-12" "Gene2 2.67e-12" "Gene3 8.67e-12" "Gene4 6.61e-12"
[5] "Gene5 2.36e-12" "Gene6 3.09e-12" "Gene7 5.44e-12" "Gene8 3.18e-13"
[9] "Gene9 1.34e-12" "Gene10 4.52e-12" "Gene11 2.03e-12" "Gene12 5.31e-12"
[13] "Gene13 9.66e-12" "Gene14 9.02e-12" "Gene15 2.91e-13" "Gene16 7.37e-13"
[17] "Gene17 7.95e-12" "Gene18 8.04e-12" "Gene19 8.31e-12" "Gene20 9.94e-12"
也许有人可以用一个简单的例子来教我如何解决这个问题。
非常感谢先进!
您可以使用固定字体(不是比例字体):
library(pheatmap)
library(grid)
library(stringr)
mat <- mtcars[1:10,1:6]
rn <- stringr::str_pad(rownames(mat), max(nchar(rownames(mat))), side = "right")
p <- signif(1e-9*mat[,4], digits = 4)
pheatmap::pheatmap(as.matrix(mtcars[1:10,1:6]), scale="column",
labels_row=paste(rn, p, sep=" "), fontfamily = "mono")
通常在 R 的 pheatmap 中显示行标签没有问题。但是,看到我有一点复杂的行标签,它们是组合了一个字符串的头部和另一个字符串的结尾的字符串。例如,"ABC**** 123".
这是一个例子和我的代码:
library(pheatmap)
library(stringr)
# create an example
test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
colnames(test) = paste("Test", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")
# make random pvalue to show at the end of rownames
random.pvalue <- formatC(runif(n = 20,min = 0.0000000000001,max = 0.00000000001),format = "e",
digits = 2)
# creat new rownames with fixed width
add.label <- paste0(str_pad(rownames(test),
width=12,
side="right"),
random.pvalue)
rownames(test) <- add.label # update rownames
# Draw heatmaps
pheatmap(test) # you could see the pvalues are not aligned
相信我,我通过在 R 中使用 formatC() 和 str_pad() 强制这些行标签的宽度固定。但是,当我将 pheatmap 与这些行标签一起使用时,标签没有显示为我想,他们像下面这样,你可以清楚地看到行标签没有对齐,即使它们具有相同的字符串宽度。
[1] "Gene1 7.77e-12" "Gene2 2.67e-12" "Gene3 8.67e-12" "Gene4 6.61e-12"
[5] "Gene5 2.36e-12" "Gene6 3.09e-12" "Gene7 5.44e-12" "Gene8 3.18e-13"
[9] "Gene9 1.34e-12" "Gene10 4.52e-12" "Gene11 2.03e-12" "Gene12 5.31e-12"
[13] "Gene13 9.66e-12" "Gene14 9.02e-12" "Gene15 2.91e-13" "Gene16 7.37e-13"
[17] "Gene17 7.95e-12" "Gene18 8.04e-12" "Gene19 8.31e-12" "Gene20 9.94e-12"
也许有人可以用一个简单的例子来教我如何解决这个问题。
非常感谢先进!
您可以使用固定字体(不是比例字体):
library(pheatmap)
library(grid)
library(stringr)
mat <- mtcars[1:10,1:6]
rn <- stringr::str_pad(rownames(mat), max(nchar(rownames(mat))), side = "right")
p <- signif(1e-9*mat[,4], digits = 4)
pheatmap::pheatmap(as.matrix(mtcars[1:10,1:6]), scale="column",
labels_row=paste(rn, p, sep=" "), fontfamily = "mono")