Тепловая карта ggplot2 с цветовой полосой фиксированного масштаба между графиками

Мне нужно нарисовать 3 разных графика, задающих один и тот же цвет диапазона шкалы. У меня есть 3 матрицы с разным диапазоном значений.

Например:

range(matrixA) 
# 0.60 0.85  
range(matrixB) 
# 0.65 0.95  
range(matrixA) 
# 0.5 1.0

Я хотел бы иметь одинаковую цветовую заливку для графиков. Например, для всех значений 0,8 на разностных графиках, если на первом графике 0,8 оранжевый, я хочу, чтобы все значения 0,8 на разных графиках были одинаковыми оранжевыми.

Моя проблема в данный момент:

На первом графике цвет максимального значения — красный, затем значение 0,85 — красный.

На втором графике максимальное значение выделено красным, но в данном случае максимальное значение равно 0,95, и возникает проблема.

Мой код:

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"))

person TheAvenger    schedule 20.06.2017    source источник
comment
пожалуйста, предоставьте воспроизводимый пример, предоставив свои данные, или моделирование их. Используйте dput(mat.melted) и вставьте результат в вопрос. Кстати, я полагаю, вы говорите о data.frames, а не о матрицах   -  person GGamba    schedule 20.06.2017


Ответы (1)


Вам нужно установить одинаковый диапазон (пределы цветовой полосы) для всех из них, а также указать цвета.

rng = range(matrixA, matrixB, matrixC)

И добавьте это в свой код ggplot:

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])))

Пример:

Ниже приведен пример, который поможет вам получить то, что вы хотите:

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")   

Это даст вам:

Ширина

person M--    schedule 20.06.2017
comment
Могу ли я попросить предложение на этот пост о ярлыках легенды. Скажем, вам нужен высокий средний низкий вместо 1,0,5,0,0. Не могли бы вы дать рекомендации о том, как бы вы этого добились? @Масуд - person Cyrillm_44; 17.03.2018
comment
@Cyrillm_44 конечно. посмотрите на этот поток stackoverflow.com/questions/ 23635662/ - person M--; 27.03.2018