Настройка цветовой тепловой карты

У меня есть файл CSV с 8 строками и 5 столбцами, который выглядит так:

,MUT,AB1,M86,MU0,MZ4
2pc0,9.3235,9.2234,8.5654,6.5688,6.0312
2hb4,7.4259,7.9193,7.0837,6.1959,9.6501
3ixo,9.1124,4.8244,9.2058,5.6194,4.8181
2i0d,10.1331,9.9726,1.7889,2.1879,1.0692
2q5k,10.7538,0.377,9.8693,1.5496,9.869
4djq,12.0394,2.4673,3.7014,10.8828,1.4023
2q55,10.7834,1.4322,5.3941,0.871,1.7253
2qi1,10.0908,10.7989,4.1154,2.3832,1.2894

Я хотел бы, чтобы следующий R-скрипт отображал тепловую карту моего набора со значениями [0;2] зеленого цвета, [2;3] желтого цвета и [3;maxvalue] красного цвета, а цвет должен развиваться непрерывно. мода.

Вот код, который я сейчас пытаюсь использовать:

#########################################################
### A) Installing and loading required packages
#########################################################

if (!require("gplots")) {
   install.packages("gplots", dependencies = TRUE)
   library(gplots)
   }
if (!require("RColorBrewer")) {
   install.packages("RColorBrewer", dependencies = TRUE)
   library(RColorBrewer)
   }


#########################################################
### B) Reading in data and transform it into matrix format
#########################################################

data <- read.csv('/mypath/raw/raw.csv', comment.char="#")
rnames <- data[,1]                            # assign labels in column 1 to "rnames"
mat_data <- data.matrix(data[,2:ncol(data)])  # transform column 2-5 into a matrix
rownames(mat_data) <- rnames                  # assign row names


#########################################################
### C) Customizing and plotting the heat map
#########################################################

# creates a own color palette from red to green
my_palette <- colorRampPalette(c("green", "yellow", "red"))(n = 299)

# (optional) defines the color breaks manually for a "skewed" color transition
col_breaks = c(seq(0,2,length=200),  # for green
  seq(2,3,length=100),           # for yellow
  seq(3,15,length=1500))             # for red

# creates a 5 x 5 inch image
png("/mypath/raw/raw.png",    # create PNG for the heat map        
  width = 5*300,        # 5 x 300 pixels
  height = 5*300,
  res = 300,            # 300 pixels per inch
  pointsize = 8)        # smaller font size

heatmap.2(mat_data,
  cellnote = mat_data,  # same data set for cell labels
  main = "Correlation", # heat map title
  notecol="black",      # change font color of cell labels to black
  density.info="none",  # turns off density plot inside color legend
  trace="none",         # turns off trace lines inside the heat map
  margins =c(12,9),     # widens margins around plot
  col=my_palette,       # use on color palette defined earlier
  breaks=col_breaks,    # enable color transition at specified limits
  dendrogram="none",     # only draw a row dendrogram
  Colv="NA" )           # turn off column clustering

dev.off()               # close the PNG device

Однако, когда я использую сценарий, который я нашел в Интернете, появляется следующая ошибка:

Error in image.default(1:nc, 1:nr, x, xlim = 0.5 + c(0, nc), ylim = 0.5 +  : 
  must have one more break than colour

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

Дополнительный вопрос:

Я также стремлюсь к реорганизации информации на выходе. Я бы хотел, чтобы заголовки столбцов и строк были сверху и слева. Кроме того, возможно ли проследить контуры вокруг следующих ящиков случаев как (x, y) = (4,1) (5,2) (6,3) (7,4) (8,5)


person Harold Grosjean    schedule 20.02.2018    source источник
comment
Ошибка гласит: my_palette имеет другую длину (299) по сравнению с col_breaks (1800).   -  person zx8754    schedule 21.02.2018


Ответы (1)


Я не уверен, что точно понимаю цвета, которые вы хотите. Если вам нужен непрерывный цветовой градиент, вам нужны два цвета для значений ›3 (градиент должен быть между красным и каким другим цветом?). В основном не хватает одного цвета (я добавила "золотой"). Вероятно, вы сможете легко адаптировать приведенный ниже пример по своему усмотрению.

Обратите внимание, что количество разрывов не должно быть слишком большим (не тысячи, как в ваших вопросах), иначе ключ будет полностью белым.

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

Насколько я знаю, невозможно разместить заголовки столбцов и строк сверху и слева с помощью heatmap.2. Невозможно ни рисовать ящики. Однако вы можете рисовать горизонтальные и вертикальные линии.

Вы можете взглянуть на пакет Bioconductor ComplexHeatmap, который обеспечивает больше контроля (включая рисование полей и изменение местоположения меток).

library(gplots)
#> 
#> Attachement du package : 'gplots'
#> The following object is masked from 'package:stats':
#> 
#>     lowess
data <- read.csv(text = ',MUT,AB1,M86,MU0,MZ4
2pc0,9.3235,9.2234,8.5654,6.5688,6.0312
2hb4,7.4259,7.9193,7.0837,6.1959,9.6501
3ixo,9.1124,4.8244,9.2058,5.6194,4.8181
2i0d,10.1331,9.9726,1.7889,2.1879,1.0692
2q5k,10.7538,0.377,9.8693,1.5496,9.869
4djq,12.0394,2.4673,3.7014,10.8828,1.4023
2q55,10.7834,1.4322,5.3941,0.871,1.7253
2qi1,10.0908,10.7989,4.1154,2.3832,1.2894', comment.char="#")

rnames <- data[,1]                            # assign labels in column 1 to "rnames"
mat_data <- data.matrix(data[,2:ncol(data)])  # transform column 2-5 into a matrix
rownames(mat_data) <- rnames                  # assign row names

# First define your breaks
col_breaks <- seq(0,max(mat_data), by = 0.1)

# Then define wich color gradient you want for between each values
# Green - red radient not recommended !!
# NB : this will work only if the maximum value is > 3
my_palette <- c(colorRampPalette(c("forestgreen", "yellow"))(20), 
                colorRampPalette(c("yellow", "gold"))(10),
                colorRampPalette(c("gold", "red"))(length(col_breaks)-31))

# x11(width = 10/2.54, height = 10/2.54)
mat_data <- round(mat_data,2) # probably better to round your values for easier reading

heatmap.2(mat_data,
          cellnote = mat_data,  # same data set for cell labels
          main = "Correlation", # heat map title
          notecol="black",      # change font color of cell labels to black
          density.info="none",  # turns off density plot inside color legend
          trace="none",         # turns off trace lines inside the heat map
          margins =c(4,4),      # widens margins around plot
          col=my_palette,       # use on color palette defined earlier
          breaks=col_breaks,    # enable color transition at specified limits
          dendrogram="none",    # only draw a row dendrogram
          Colv="NA",            # turn off column clustering

          # add horizontal and vertical lines (but no box...)
          colsep = 3,
          rowsep = 3,
          sepcolor = "black",

          # additional control of the presentation
          lhei = c(3,10),       # adapt the relative areas devoted to the matrix
          lwid = c(3,10), 
          cexRow = 1.2,
          cexCol = 1.2,
          key.title = "",
          key.par = list(mar = c(2,0.5,1.5,0.5), mgp = c(1, 0.5, 0))
          )           

Создано 25 февраля 2018 г. с помощью пакета reprex (v0.2.0).

person Gilles    schedule 25.02.2018
comment
Спасибо, это было очень полезно! - person Harold Grosjean; 03.03.2018
comment
Большой ! Пожалуйста, рассмотрите возможность принятия ответа - person Gilles; 03.03.2018