Как объединить непрерывную и дискретную цветовые шкалы в pheatmap: как установить 0 в качестве другого цвета
После значительного времени, просматривая форум о том, как устанавливать перерывы в pheatmap, я решил написать здесь пост, чтобы сэкономить время других.
Решения были либо i) извилистыми, ii) плохо объясненными, либо iii) превосходно объясненными для подобных решений, но не подходящим решением для моих данных (эти посты были очень полезны для меня, и я бы посоветовал проверить их!): 1, 2 и 3.
Примечание: я заметил несколько постов на форуме, посвященных заполнению NA (пропущенных значений) цветом (например, pheatmap: Color for NA), и хотя это может быть подходящим для некоторых наборов данных, это НЕ подходит для моих данных. Нули - это биологически значимые числа; однако в моем изображении они отвлекают читателя, так как они очень похожи по цвету на низкие значения (например, менее 10 или около того). Если бы я установил 0 как NA, это изменило бы кластеризацию моих данных. То, что я хотел сделать, это установить 0 для определенного цвета и иметь значения>0, которые отображаются в виде (непрерывной) цветовой шкалы.
Справочная информация: я работаю с данными протеомики, собранными из масс-спектрометрии - в частности, спектральных подсчетов. Матрица создается путем упорядочения данных таким образом, чтобы каждый столбец содержал данные из одного образца (например, клеточной линии), и каждая строка соответствовала одному признаку (например, пептиду или белку) (рассмотрено в Key et al., 2013 BMC Bioinformatics), Значения данных варьируются от 0> (в данном случае 140).
Желаемое решение:
- Ноль должен быть окрашен в серый
- Значения> 1 должны быть цветовой шкалой (мне нравится палитра Уэса Андерсона "Life Aquatic")
Загрузите data.frame и преобразуйте в матрицу
df <- read.csv("my_data.csv") # load csv as data.frame object
rnames <- df[,1]
mat_data <- data.matrix(df[,2:ncol(df)]) # convert data.frame into matrix
rownames(mat_data) <- rnames
Установите два цвета: один дискретный цвет для нулевых значений и цветовую шкалу для значений> 1
install.packages("wesanderson")
library(wesanderson)
col1 <- rep("grey",2) # set a color to show all SCs that are 0's
col2 <- wes_palette("Zissou1", 140, type="continuous") # set a color palette to show values >0
colors <- c(col1,col2)
Постройте тепловую карту
pheatmap(mat_data, cellwidth=9, cellheight=9, color=colors, scale="none")
Конечно я прикрепил dput(mat_data)
так что этот пример воспроизводим.
структура (c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 20L, 0L, 0L, 9L, 6L, 57L, 0L, 0L, 3L, 17L, 0L, 10L, 0L, 0L, 125L, 2L, 49L, 10L, 0L, 0L, 23L, 0L, 0L, 37L, 3L, 54L, 2L, 44L, 13L, 18L, 0L, 21L, 0L, 31L, 38L, 5L, 114L, 0L, 88L, 11L, 23L, 0L, 22L, 3L, 33L, 33L, 6L, 140L, 3L, 83L, 6L, 23L, 0L, 0L, 0L, 0L, 0L, 1L, 4L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 4L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 3L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 5L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 4L, 0L, 3L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 6L, 0L, 3L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 10L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 9L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 11L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 10L, 0L, 0L, 0L, 0L), .Dim = c(11L, 35L), .Dimnames = list(c("Pep1", "Pep2", "Pep45", "PepNChed", "Pep666", "Pep420", "PeppyLPew", "PeppaNSalt", "Pep1441", "PepNStep", "PepPep"), c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", "X23", "X24", "Х25", "Х26", "Х27", "Х28", "Х29", "Х30", "Х31", "Х32", "Х33", "Х34", "Х35"))
Удачного кодирования:)