Мне было интересно, знает ли кто-нибудь о пакете, который позволяет частично маркировать строки тепловых карт.В настоящее время я использую pheatmap () для создания своих тепловых карт, но я могу использовать любой пакет, который имеет эту функциональность.
У меня есть графики с множеством рядов дифференциально экспрессируемых генов, и я хотел бы обозначить их подмножество.Есть две основные вещи, которые нужно учитывать (о которых я могу думать):
- Расположение текстовой аннотации зависит от высоты строки.Если строки слишком узкие, текстовая метка будет неоднозначной без какого-либо указателя.
- Если несколько смежных строк значимы (т. Е. Будут помечены), их необходимо сместить, и снова потребуется указатель.
Ниже приведен примерчастичное решение, которое на самом деле идет только наполовину, но я надеюсь, иллюстрирует то, что я хотел бы сделать.
set.seed(1)
require(pheatmap)
require(RColorBrewer)
require(grid)
### Data to plot
data_mat <- matrix(sample(1:10000, 300), nrow = 50, ncol = 6)
rownames(data_mat) <- paste0("Gene", 1:50)
colnames(data_mat) <- c(paste0("A", 1:3), paste0("B", 1:3))
### Set how many genes to annotate
### TRUE - make enough labels that some overlap
### FALSE - no overlap
tooMany <- T
### Select a few genes to annotate
if (tooMany) {
sigGenes_v <- paste0("Gene", c(5,20,26,42,47,16,28))
newMain_v <- "Too Many Labels"
} else {
sigGenes_v <- paste0("Gene", c(5,20,26,42))
newMain_v <- "OK Labels"
}
### Make color list
colors_v <- brewer.pal(8, "Dark2")
colors_v <- colors_v[c(1:length(sigGenes_v), 8)]
names(colors_v) <- c(sigGenes_v, "No")
annColors_lsv <- list("Sig" = colors_v)
### Column Metadata
colMeta_df <- data.frame(Treatment = c(rep("A", 3), rep("B", 3)),
Replicate = c(rep(1:3, 2)),
stringsAsFactors = F,
row.names = colnames(data_mat))
### Row metadata
rowMeta_df <- data.frame(Sig = rep("No", 50),
stringsAsFactors = F,
row.names = rownames(data_mat))
for (gene_v in sigGenes_v) rowMeta_df[rownames(rowMeta_df) == gene_v, "Sig"] <- gene_v
### Heatmap
heat <- pheatmap(data_mat,
annotation_row = rowMeta_df,
annotation_col = colMeta_df,
annotation_colors = annColors_lsv,
cellwidth = 10,
main = "Original Heat")
### Get order of genes after clustering
genesInHeatOrder_v <- heat$tree_row$labels[heat$tree_row$order]
whichSigInHeatOrder_v <- which(genesInHeatOrder_v %in% sigGenes_v)
whichSigInHeatOrderLabels_v <- genesInHeatOrder_v[whichSigInHeatOrder_v]
sigY <- 1 - (0.02 * whichSigInHeatOrder_v)
### Change title
whichMainGrob_v <- which(heat$gtable$layout$name == "main")
heat$gtable$grobs[[whichMainGrob_v]] <- textGrob(label = newMain_v,
gp = gpar(fontsize = 16))
### Remove rows
whichRowGrob_v <- which(heat$gtable$layout$name == "row_names")
heat$gtable$grobs[[whichRowGrob_v]] <- textGrob(label = whichSigInHeatOrderLabels_v,
y = sigY,
vjust = 1)
grid.newpage()
grid.draw(heat)
Вот несколько выводов:
оригинальная карта тепла:
метки ok:
метки ok, с флагами:
слишком много меток
слишком много меток с флагами
Выводы "с флагами"желаемые конечные результаты.
Я просто сохранил их как изображения из средства просмотра графиков Rstudio.Я понимаю, что могу сохранить их в формате PDF и предоставить больший размер файла, чтобы избавиться от наложения меток, но тогда отдельные ячейки будут больше, чем я хочу.