12

ggplot2のstat_binhex()を使用して、同じチャートに2つの独立変数を同時にプロットし、それぞれがscale_colour_gradientn()を使用して独自のカラーグラデーションを使用したいと思います。

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

ここでggplot2googleグループに関連する問題の会話を見つけました。

4

2 に答える 2

12

別の可能な解決策は次のとおりです。ビンカウントをアルファ透明度にマッピングするという@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. 私は賢明な色/アルファの凡例を表示しようとしました(そして失敗しました)。トリッキーなようですが、ggplot2のすべての凡例のカスタマイズ機能を考えると可能であるはずです。

  2. X軸ユニットのラベル付けには、ある種の解決策が必要です。1つの軸に2セットのユニットをプロットすることは多くの人に嫌われており、ggplot2にはそのような機能はありません。

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

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

ここに画像の説明を入力してください

于 2012-11-01T01:41:54.730 に答える
6

私はあなたが望むものは、ggplot2より一般的にグラフィックスアプローチの原則と文法に反すると思います。問題が解決されるまで(私は息を止めません)、いくつかの選択肢があります

使用facet_wrapしてalpha

これは素晴らしい伝説を生み出すことはありませんが、あなたが望むものに何とかあなたを連れて行きます。

によってアクセスさalphaれる計算された値によってスケーリングする値を設定できます。Frequency..Frequency..

しかし、伝説をうまくマージできるとは思いません。

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

ここに画像の説明を入力してください

またはとgridExtra一緒に使用grid.arrangearrangeGrob

個別のプロットを作成し、それを使用gridExtra::grid.arrangeして1つの画像に配置することができます。

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)

ここに画像の説明を入力してください

これを機能させたい場合ggsave(以下の@bdemarestコメントと@baptisteに感謝します)

grid.arrangeのようなものに置き換えarrangeGrobます。

ggsave(plot=arrangeGrob(d_carat, d_depth, ncol=1), filename="plot_2.pdf", height=12, width=8)
于 2012-10-31T22:38:19.863 に答える