2017-06-20 1059 views
1

我需要繪製3個不同的圖來設置相同的比例範圍顏色。 我有3個不同數值範圍的矩陣。R ggplot2熱圖貼圖之間的固定比例顏色

例如:

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

PLS提供通過提供您的數據的[再現的示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) ,或者對它們進行模擬。使用'dput(mat.melted)'並將結果粘貼到問題中。順便說一句我想你說的是data.frames,而不是matrix-es – GGamba

回答

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

這將給你:

+0

非常感謝你! :) 有用! :) – TheAvenger

0

加入0.5和1

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(colors = c("yellow","orange","red")),limits=c(0.5,1))