2016-10-22 13 views
6

Rで2つのビン分布図を減算する方法があるのだろうかと思っていました。同じ軸を持つ2つの分布を持ち、もう一方の上に重ね合わせて差分散布図を作成する。プロットのR差散布図

enter image description hereenter image description here

と私のスクリプト::ここで

は私の2つのプロットである

​​

このについて移動する方法上の任意のアドバイスはとても参考になります。

EDIT は、これを行うための追加の方法を見つけた:

xbnds <- range(x1,x2) 
ybnds <- range(y1,y2) 
bin1 <- hexbin(x1,y1,xbins= 200, xbnds=xbnds,ybnds=ybnds) 
bin2 <- hexbin(x2,y2,xbins= 200, xbnds=xbnds,ybnds=ybnds) 
erodebin1 <- erode.hexbin(smooth.hexbin(bin1)) 
erodebin2 <- erode.hexbin(smooth.hexbin(bin2)) 
hdiffplot(erodebin1, erodebin2) 
+2

、軸、色で遊んするのは簡単ですあなたは一つだけのプロットを作成しました。シミュレートされたデータを構築する例を読んで、あなたの作業に似ている2つのデータセットを生成する疑似体にコードを追加してください。 –

答えて

7

さてさて、出発点として、ここではいくつかのサンプルデータです。それぞれはランダムであり、一方は(2,2)にシフトされている。

df1 <- 
    data.frame(
    x = rnorm(1000) 
    , y = rnorm(1000) 
) 

df2 <- 
    data.frame(
    x = rnorm(1000, 2) 
    , y = rnorm(1000, 2) 
) 

はビンが同一であることを確実にするために、1つの hexbinオブジェクトを構築するのが最善です。これを達成するために、 dplyrbind_rowsを使用して、data.frameがどのデータから来たのかを追跡します(これは、grouping変数を持つ単一のdata.frameがあればさらに簡単になります)。

bothDF <- 
    bind_rows(A = df1, B = df2, .id = "df") 


bothHex <- 
    hexbin(x = bothDF$x 
     , y = bothDF$y 
     , IDs = TRUE 
     ) 

次に、我々は、各セル内の各の発生をカウントするhexbindplyrのミックスを使用しています。まず、ビンに適用してテーブルを作成します(すべてのレベルが表示されていることを確認するにはfactorを使用する必要があります。次に、それを簡略化し、mutateで計算されたdata.frameを構築して、カウントの差を計算し、各IDのxとyの値を与えるテーブルに再び結合します。

counts <- 
    hexTapply(bothHex, factor(bothDF$df), table) %>% 
    simplify2array %>% 
    t %>% 
    data.frame() %>% 
    mutate(id = as.numeric(row.names(.)) 
     , diff = A - B) %>% 
    left_join(data.frame(id = [email protected], hcell2xy(bothHex))) 

head(counts)います:それはより多くの制御(およびより簡単に塗りつぶしとしてカウントとは異なる変数を使用する機能)を提供していますよう

A B id diff   x   y 
1 1 0 7 1 -1.3794467 -3.687014 
2 1 0 71 1 -0.8149939 -3.178209 
3 1 0 79 1 1.4428172 -3.178209 
4 1 0 99 1 -1.5205599 -2.923806 
5 2 0 105 2 0.1727985 -2.923806 
6 1 0 107 1 0.7372513 -2.923806 

は最後に、私たちは、結果のデータをプロットするためにggplot2を使用するよりもhexbinそれ自身。そこから

enter image description here

counts %>% 
    ggplot(aes(x = x, y = y 
      , fill = diff)) + 
    geom_hex(stat = "identity") + 
    coord_equal() + 
    scale_fill_gradient2() 

は、など