2017-02-11 5 views
1

私は変数に基づいて各タイルの透明度を指定したいgeom_tileを使ってプロットを作成しています。しかし、aes()でアルファを指定すると、色ではなく塗りつぶしにのみ適用されます。これにより、タイル間の線がタイルよりも暗いプロットが得られます。色のアルファを指定する方法はありますか? geom_rasterを使用することは、地図用のオプションではないので、座標投影を使用したいと思います。カラー指定を削除すると、プロットが見えなくなります。塗りつぶしと色の両方にアルファを指定する方法

ここに私の問題を再現するいくつかのコードがあります。 @alistaire同様

library(ggplot2) 
library(scales) 
library(reshape) 

volcano3d <- melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 
ggplot(volcano3d, aes(x, y, z = z,fill=z,color=z)) + 
    geom_tile(aes(alpha=y))+ 
    theme_bw() 
+0

あなたがscale_color_gradient 'のようなもの(低= '#00000000'、高= 'hotpink')'でこれを行うことができるはずのように思えるが、それは悲しげに無視します(それはそれを受け入れるが...) - 多分色空間の問題。 – alistaire

+0

そうだと思いますが、scale_color_gradient()にアルファを指定しても効果がないことがわかりました。色と塗りつぶしに別々のアルファが必要なようです。 – pthomp

+0

アルファはそれ自身の審美的です。そのため、 'scale_alpha_continuous'が存在します。しかし、はい、 'geom_tile'では、塗りつぶしにのみ影響し、ストロークには影響しません。'scale_color_gradient'アプローチはちょっとハッキリですが、根底にあるカラーハンドリングのせいで失敗するようです。あまりにも多くの作業として拒否されるかもしれませんが、正しく組み立てれば、GitHubの問題が発生する可能性があります。 – alistaire

答えて

2

geom_tileタイル境界がalphaマッピングに従うべきであると私には思えたが、彼らは表示されません。この問題を回避するには、geom_segmentを使用して、境界線を配置する場所と同じ位置に線分を描画します。これらのセグメントはalphaのマッピングに従います。

以下のコードでは、まずセグメントを描画するための新しいデータフレームsegsを作成します。元のデータを使用することもできますが、短い1行1列です。

library(dplyr) 

segs = expand.grid(x=(min(volcano3d$x)-1):max(volcano3d$x), 
        y=(min(volcano3d$y)-1):max(volcano3d$y)) %>% 
    left_join(volcano3d) 

プロットにセグメントを追加するために、我々は、それぞれ、垂直または水平セグメントのための正しい順序でのxとyの値を取得するたびにソートする必要があります。また、にcolour="#FFFFFF00"を使用して、デフォルトのタイル境界線を削除します。下のプロットで

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) 

、あなたはタイルの境界線を見ることができますが、彼らは、タイル自身と一緒にフェード。境界線はタイルの上に描かれているため少し暗くなり、タイルだけの不透明度が約2倍になります。

enter image description here

あなたがタイルの境界があまり顕著になりたい場合は、タイルアルファ値に対するそれらalpha値をスケールダウンすることができます。

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    #geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=1.5) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=1.5) 

enter image description here

がここにあります:

ggplot(volcano3d, aes(fill=z, colour=z)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y, alpha=y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5, alpha=0.2*y), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5, alpha=0.2*y), size=0.2) 

enter image description here

セグメントはタイルの色とアルファ値を模倣していることを自分自身を納得させるためには、タイルやプロット太い線を削除することができます色のグラディエントが変化するバージョンで、の範囲でコントラストが向上します個の値は:

ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) + 
    geom_tile(colour="#FFFFFF00", aes(x, y)) + 
    geom_segment(data=segs %>% arrange(x,y), 
       aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) + 
    geom_segment(data=segs %>% arrange(y,x), 
       aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) + 
    scale_fill_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) + 
    scale_colour_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) 

enter image description here

関連する問題