2017-03-07 19 views
0

ggplot2でgeom_tileを使用する比較的簡単なヒートマップがあります。それは色付きボックス(df1)として連続したデータの小さな行列です。TRUEの値(df2)の概要を示す2番目の論理geom_tileをオーバーレイしたいと思います。そのようなことはできますか?私は2つのヒートマップを一緒に追加すると醜いように思えるが、これは小さくてかわいい事である。ggplotに2番目のgeom_tileレイヤーを追加します

library(ggplot2) 
n <- 4 
df1 <- data.frame(x = rep(letters[1:n], times = n), 
        y = rep(1:n, each = n), 
        z = rnorm(n^2)) 

df2 <- data.frame(x = rep(letters[1:n], times = n), 
        y = rep(1:n, each = n), 
        z = FALSE) 
df2$z[c(2,14)] <- TRUE 

p1 <- ggplot(df1, aes(x = x, y = y)) 
p1 <- p1 + geom_tile(aes(fill = z), colour = "grey20") 
p1 <- p1 + scale_fill_gradient2(low = "darkgreen", 
           mid = "white", 
           high = "darkred", 
           breaks = c(min(df1$z), max(df1$z)), 
           labels = c("Low", "High")) 
p1 
# overlay df2 to outline the TRUE boxes or dim the FALSE boxes with alpha? 
# p1 <- p1 + geom_tile(data = df2, aes(fill = z), colour = "grey20") 
+1

どのように 'true'をを強調するために、異なるラインサイズを使用してはどうですか?アルファ= 0、カラー= "青")+ scale_size_discrete( "あなたの凡例"、範囲= c(あなたの凡例) 3、0.5)) '。 – JasonWang

+0

非常にクール!ありがとう。 – user4100013

答えて

1

ちょうど1がそうあなたが埋めるために最初のz値をマッピングすることができますに2つのデータセットをマージ、およびアルファの他:あなたはストロークの色を代わりに使用することができ

ggplot(merge(df1, df2, by = c('x', 'y')), aes(x = x, y = y)) + 
    geom_tile(aes(fill = z.x, alpha = z.y), colour = "grey20") + 
    scale_fill_gradient2(low = "darkgreen", 
         mid = "white", 
         high = "darkred", 
         breaks = c(min(df1$z), max(df1$z)), 
         labels = c("Low", "High")) 

plot with fill and alpha

アルファの、しかしストロークは部分的にはgeom_tileによってカバーされます:

ggplot(merge(df1, df2, by = c('x', 'y')), aes(x = x, y = y)) + 
    geom_tile(aes(fill = z.x, colour = z.y), size = 2) + 
    scale_fill_gradient2(low = "darkgreen", 
         mid = "white", 
         high = "darkred", 
         breaks = c(min(df1$z), max(df1$z)), 
         labels = c("Low", "High")) + 
    scale_color_manual(values = c('#00000000', 'blue')) 

outlined tiles

ので、それを適切にプロットするために取得するには、塗りつぶしのための一つの層とそれを通じハックする必要があります、明確な塗りつぶしと輪郭のために、その後1層:

ggplot(merge(df1, df2, by = c('x', 'y')), aes(x = x, y = y)) + 
    geom_raster(aes(fill = z.x)) + 
    geom_tile(aes(colour = z.y), fill = '#00000000', size = 2) + 
    scale_fill_gradient2(low = "darkgreen", 
         mid = "white", 
         high = "darkred", 
         breaks = c(min(df1$z), max(df1$z)), 
         labels = c("Low", "High")) + 
    scale_color_manual(values = c('#00000000', 'blue')) 

properly outlined raster

+0

アルファ版のサンプルが私のニーズに最適だと思います。どうもありがとう! – user4100013

1

I @ JasonWangにも同様のアプローチがありましたが、私は境界線の色と大きさの両方を設定しました。

p1 + geom_tile(data=df2, aes(colour=factor(z, c(TRUE, FALSE)), size=factor(z, c(TRUE, FALSE))), alpha=0) + 
    scale_colour_manual("z", values=c("blue4", "white")) + 
    scale_size_manual("z", values=c(3, 0)) 

enter image description here

+0

非常にクール!ありがとう。 – user4100013

関連する問題