TheAvenger TheAvenger - 2 months ago 9
R Question

R ggplot2 heatmap fixed scale color between graphs

I need to draw 3 different plots setting the same scale range color.
I have 3 matrices with different range of values.
For example:

the first matrix A have value from 0.6 to 0.85

the second matrix B have value from 0.65 to 0.95

the third matrix C have value from 0.5 to 1

I would like to have the same color for all 0.8 value in the difference plots, then if in the first plot 0.8 is for example orange, I want that all 0.8 value in different graph is the same orange.

My problem in this moment is:
In the first plot, the color of the max value is red, then the value 0.85 is red.
In the second plot, the max value is red but in this case the max value is 0.95 and, in the second plot the value 0.85 is not the same color of the first plot :(

My code:

mat.melted <- melt(matrixA)
colnames(mat.melted) <- c("p","c","v")
p <- ggplot(mat.melted, aes(x=c,y=p,fill=v) +
geom-tile() +
scale_fill_gradintn(limits = c(min(as.vector(matrixA)), max(as.vector(matrixA))),
colors = c("yellow","orange","red"))


Thank you so much! :)

Answer Source

You need to set the range (limits of color bar) same for all of them and also specify the colors for it.

rng = range(matrixA, matrixB, matrixC)

And add this to your ggplot code:

g + scale_fill_gradient2(low="green", mid="lightblue", high="red", #colors in the scale
               midpoint=mean(rng),    #same midpoint for plots (mean of the range)
               breaks=seq(0,1,0.25), #breaks in the scale bar
               limits=c(floor(rng[1]), ceiling(rng[2])))

Example:

Below is an example that helps you to get what you want:

x <- matrix(60:85, 5)/100
y <- matrix(65:95, 5)/100
z <- matrix(50:100, 5)/100


rng = range(c((x), (y), (z)))

library(reshape)
library(ggplot2)

ggplot(data = melt(x)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
  scale_fill_gradient2(low="green", mid="lightblue", high="red", #colors in the scale
                   midpoint=mean(rng),    #same midpoint for plots (mean of the range)
                   breaks=seq(0,1,0.25), #breaks in the scale bar
                   limits=c(floor(rng[1]), ceiling(rng[2]))) + #same limits for plots
                   ggtitle("X")

ggplot(data = melt(y)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
  scale_fill_gradient2(low="green", mid="lightblue", high="red", 
                   midpoint=mean(rng),   
                   breaks=seq(0,1,0.25), 
                   limits=c(floor(rng[1]), ceiling(rng[2]))) +
                    ggtitle("Y")                  

ggplot(data = melt(z)) + geom_tile(aes(x=X1,y=X2,fill = value)) +
 scale_fill_gradient2(low="green", mid="lightblue", high="red", 
                   midpoint=mean(rng),    
                   breaks=seq(0,1,0.25), 
                   limits=c(floor(rng[1]), ceiling(rng[2]))) +
                    ggtitle("Z")   

This will give you: