I have a 8 rows and 5 columns CSV file that looks like this:
,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
I would like the following R script to plot a heat map of my set with values [0;2] to be green, [2;3] to be yellow and [3;maxvalue] to be red and colour should evolve in a continuous fashion.
Here is the code I am currently trying to use:
#########################################################
### 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
However, when I use the script that I found on the internet, the following error appears:
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
I would be very grateful if you could indicate me how to and replace the 15 with the default maximum value and adjusting the colour range and skewing accordingly.
Further question:
I am also aiming at reorganizing the information on the output. I would the columns and rows headings to be on the top and on the left. Furthermore, is it possible trace the contours around the following cases boxes as (x,y)=(4,1) (5,2) (6,3) (7,4) (8,5)
I'm not certain to understand exactly the colors you want. If you want a continuous color gradient, you need two colors for the values >3 (the gradient should be between red and which other color ?). Basically one color is missing (I added "gold"). You will probably be able to easily adapt the example below as you whish.
Note that the number of breaks should not be too high (not thousands as in your questions) otherwise the key will be entirely white.
Note also that green to red gradients are really not recommended as an non negligible proportion of the human population is color blind to these colors (prefer blue - red or blue - green).
As far as I know it is not possible to place the columns and rows headings
on the top and on the left margins with heatmap.2
. It is not possible neither to draw boxes. However you can draw horizontal and vertical lines.
You might look at the Bioconductor package ComplexHeatmap
that allows more control (including drawing boxes and changing the location of the labels).
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))
)
Created on 2018-02-25 by the reprex package (v0.2.0).