2012-10-31 9 views
11

ggplot2のstat_binhex()を使用して、同じチャート上に2つの独立変数を同時にプロットしたい場合は、scale_colour_gradientn()ggplot2 1つの画像内に異なる色勾配を持つ複数のstat_binhex()プロット

x軸単位が一致しないという事実を無視すれば、再現可能な例は、別々の塗りつぶし勾配を維持しながら同じ画像に次のものをプロットすることです。

d <- ggplot(diamonds, aes(x=carat,y=price))+ 
    stat_binhex(colour="white",na.rm=TRUE)+ 
    scale_fill_gradientn(colours=c("white","blue"),name = "Frequency",na.value=NA) 
try(ggsave(plot=d,filename=<some file>,height=6,width=8)) 

enter image description here

d <- ggplot(diamonds, aes(x=depth,y=price))+ 
    stat_binhex(colour="white",na.rm=TRUE)+ 
    scale_fill_gradientn(colours=c("yellow","black"),name = "Frequency",na.value=NA) 
try(ggsave(plot=d,filename=<some other file>,height=6,width=8)) 

enter image description here

私はggplot2のGoogleグループhereの関連問題のいくつかの会話を見つけました。

答えて

10

は、別の可能な解決策である:彼らは同じ軸上にプロットすることができますので、私はアルファ透明度にマッピングビンカウントのmnelのアイデア@とっている、と私は、x-の変数を変えてきました。

library(ggplot2) 

# Transforms range of data to 0, 1. 
rangeTransform = function(x) (x - min(x))/(max(x) - min(x)) 

dat = diamonds 
dat$norm_carat = rangeTransform(dat$carat) 
dat$norm_depth = rangeTransform(dat$depth) 

p1 = ggplot(data=dat) + 
    theme_bw() + 
    stat_binhex(aes(x=norm_carat, y=price, alpha=..count..), fill="#002BFF") + 
    stat_binhex(aes(x=norm_depth, y=price, alpha=..count..), fill="#FFD500") + 
    guides(fill=FALSE, alpha=FALSE) + 
    xlab("Range Transformed Units") 

ggsave(plot=p1, filename="plot_1.png", height=5, width=5) 

思想:

  1. Iは、賢明なカラー/アルファ凡例を表示しようとした(失敗しました)。扱いにくいですが、ggplot2のすべての凡例カスタマイズ機能があれば可能です。

  2. X軸単位のラベルには、何らかの解決策が必要です。 1つの軸上に2組のユニットをプロットすると、多くの人が悩まされ、ggplot2にはそのような特徴はありません。

  3. この例では、重なり合った色のセルの解釈は十分に見えますが、使用するデータセットと選択した色によって非常に乱雑になる可能性があります。

  4. 2つの色が相補的な補色である場合、それらの色が等しく重なり合っていれば、ニュートラルグレーが表示されます。オーバーラップが等しくない場合、グレーはより黄色に、またはより青色にシフトする。私の色は灰色のオーバーラップセルのややピンク色の色合いで判断するとかなり補完的ではありません。

enter image description here

+0

これは正しい方向です。各stat_binhex()にscale_fill_gradientn()を割り当てる方法についての考え方はありますか?また、考えられる#2は正当な点に注意してください。私の意図するアプリケーションは、両方の変数に同じユニットを使用します。 – metasequoia

+0

各 'ggplot'呼び出しには、' fill'スケールしか存在できません。値の範囲*変数の組み合わせごとに、手動で指定された色で 'scale_fill_manual'を定義する何らかのハックを描くことができます。次に、 'stat_binhex'を呼び出すたびに、' fill'を変数固有の要素にマッピングします。しかし、今、私はちょうどうんざりしています... – bdemarest

5

ggplot2の原則とグラフィックスの文法に逆らってほしいと思うのがより一般的です。 issueが(そのために私は息を止めていないでしょう)アドレス指定されるまでの間、あなたは選択肢のカップルに

使用facet_wrapalpha

これは素敵凡例を生成しませんが、に何らかの方法表示されますがありますあなたが欲しいもの。

あなたは、私はあなたががうまく伝説をマージすることができるとは思わない..Frequency..

がアクセスし、計算されたFrequencyによりスケールするalpha値を設定することができます。 grid.arrangeまたはarrangeGrob

library(reshape2) 
# in long format 
dm <- melt(diamonds, measure.var = c('depth','carat')) 

ggplot(dm, aes(y = price, fill = variable, x = value)) + 
    facet_wrap(~variable, ncol = 1, scales = 'free_x') + 
    stat_binhex(aes(alpha = ..count..), colour = 'grey80') + 
    scale_alpha(name = 'Frequency', range = c(0,1)) + 
    theme_bw() + 
    scale_fill_manual('Variable', values = setNames(c('darkblue','yellow4'), c('depth','carat'))) 

enter image description here

使用gridExtra

あなたが別のプロットを作成し、単一の画像の上に配置するgridExtra::grid.arrangeを使用することができます。

d_carat <- ggplot(diamonds, aes(x=carat,y=price))+ 
    stat_binhex(colour="white",na.rm=TRUE)+ 
    scale_fill_gradientn(colours=c("white","blue"),name = "Frequency",na.value=NA) 

d_depth <- ggplot(diamonds, aes(x=depth,y=price))+ 
    stat_binhex(colour="white",na.rm=TRUE)+ 
    scale_fill_gradientn(colours=c("yellow","black"),name = "Frequency",na.value=NA) 

library(gridExtra) 


grid.arrange(d_carat, d_depth, ncol =1) 

enter image description here

あなたはこれがggsaveで作業したい場合は(おかげで以下のコメントと@baptisteを@bdemarestする)

は次のようarrangeGrob何かをgrid.arrangeを交換してください。ここで

ggsave(plot=arrangeGrob(d_carat, d_depth, ncol=1), filename="plot_2.pdf", height=12, width=8) 

+2

あなたは 'grid.arrange'ため' arrangeGrob'を置き換える場合は、 'ggsaveを()'を使用することができます。例: 'ggsave(plot = arrangeGrob(d_carat、d_depth、ncol = 1)、ファイル名=" plot_2.pdf "、高さ= 12、幅= 8)'。 (@baptisteはこれまでのコメントで私にこれを指摘しました) – bdemarest

+0

ありがとう@bdemarest、非常に便利です。 – mnel

+0

最初の回答は、新しいバージョンのggplotでは機能しなくなる可能性があります。[here](https://stackoverflow.com/questions/39446852/geom-hexbin-map-bincount-to-alpha/)を参照してください。 – Axeman

関連する問題