Нет цвета границы на карте в R

Я изучаю R для анализа данных экспрессии генов.

Я мог бы создать красивую тепловую карту, используя пакет pheatmap. Однако при переходе между блоками разного цвета он автоматически вводит цвет границы, который я вижу после увеличения. Это несмотря на добавление атрибута border_color = "NA". Можно ли получить непрерывно меняющуюся тепловую карту? Спасибо.

Мой код:

 pheatmapM <-pheatmap(datExprM, border_color = "NA", breaks = NULL, color = colorRampPalette(c("navy", "black", "yellow"))(50), cluster_rows = TRUE, cluster_cols = TRUE, scale = "row")

Моя тепловая карта

Как вы можете видеть ниже (после масштабирования), соседние прямоугольники разделены более светлыми цветами.

Увеличенная тепловая карта с более светлыми границами


person Abhishek Parab    schedule 01.06.2017    source источник
comment
Попробуйте border_color = NA без кавычек вокруг NA ?   -  person neilfws    schedule 02.06.2017
comment
Уже пробовал, не работает.   -  person Abhishek Parab    schedule 02.06.2017
comment
И border_color = NA, и border_color = "NA" у меня отлично работают   -  person Al14    schedule 14.06.2017
comment
На самом деле это работало на компьютере с Windows, но не работало на моем Mac. Довольно странно.   -  person Abhishek Parab    schedule 15.06.2017
comment
У меня точно такая же проблема. Вы когда-нибудь догадывались об этом? Я даже редактирую файл svg, и по какой-то причине рендереры svg по-прежнему показывают границу с атрибутом штриха, для которого установлено значение none.   -  person Ryan Ward    schedule 28.10.2020
comment
Наблюдение: на самом деле я пришел сюда, потому что мои границы не отображались, при создании png в окнах эти строки отсутствуют и становятся видимыми при записи изображения в виде svg. Как необычно.   -  person Benjamin Simpson    schedule 21.01.2021


Ответы (1)


Вы можете редактировать цвета границ индивидуально для каждой ячейки, что может быть использовано для решения этой проблемы. Точное решение будет зависеть от точного состава вашего объекта pheatmap.

Во-первых, получите имена гробов (графических объектов), хранящихся в вашей тепловой карте. Вам нужно будет взять тот, который соответствует отдельным прямоугольникам (ячейкам) тепловой карты. Для меня это первый гроб класса gTree, но попробуйте и посмотрите, какой из них подойдет вам. Вот как я извлекаю имя гроба:

grob_classes <- purrr::map(pheatmapM$gtable$grobs, class)
idx_grob <- which(purrr::map_lgl(grob_classes, function(cl) 'gTree' %in% cl))[1]

Затем нам нужно найти прямоугольный гроб, который является дочерним элементом gTree гроба, который мы только что нашли, например:

grob_names <- names(pheatmapM$gtable$grobs[[idx_grob]]$children)
idx_rect <- grob_names[grep('rect', grob_names)][1]

Теперь из этого вложенного гроба можно извлечь графические параметры: fill (определяет фактический цвет заливки каждой ячейки) и col (определяет цвет границы). По умолчанию col — это одно значение, тогда как fill — это матрица шестнадцатеричных кодов. Когда я заменяю col тем, что хранится в fill, вот так...

pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$col <- pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$fill

... это равносильно устранению границы, поскольку теперь она того же цвета, что и заливка. Чтобы убедиться, что между ячейками не осталось промежутков, также увеличьте толщину границы.

pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$lwd <- 3

По моему мнению, потенциальные проблемы могут возникнуть с определением правильного idx_grob или idx_rect в вашем конкретном pheatmap. По этой причине я включил воспроизводимый пример (с R 4.0.3 и pheatmap 1.0.12, работающими в macOS), который достигает желаемого результата (без границ и пробелов между ячейками), который вы можете использовать для начала:

set.seed(1)

## Generate sample data
x <- table(round(rnorm(500, 100, 2)), round(rnorm(500, 100, 2)))
ph <- pheatmap::pheatmap(x, cluster_cols = FALSE, cluster_rows = FALSE)

## Extract the right grob
grob_classes <- purrr::map(ph$gtable$grobs, class)
idx_grob <- which(purrr::map_lgl(grob_classes, function(cl) 'gTree' %in% cl))[1]
grob_names <- names(ph$gtable$grobs[[idx_grob]]$children)
idx_rect <- grob_names[grep('rect', grob_names)][1]

## Remove borders around cells
ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$col <- ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$fill
ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$lwd <- 3

## Plot result
graphics::plot.new()
print(ph)

Результат должен выглядеть так:

person davnovak    schedule 26.01.2021