2016-10-22 2 views
6

Мне было интересно, есть ли способ вычесть два разбросанных графика рассеяния друг от друга в R. У меня есть два распределения с одинаковыми осями и вы хотите наложить один поверх другого и вычесть их из создавая разностный график рассеяния.R - диаграмма разностного разброса

Вот мои два участка:

enter image description hereenter image description here

и мой сценарий для участков:

library(hexbin) 
library(RColorBrewer) 

setwd("/Users/home/") 
df <- read.table("data1.txt") 
x <-df$c2 
y <-df$c3 

bin <-hexbin(x,y,xbins=2000) 
my_colors=colorRampPalette(rev(brewer.pal(11,'Spectral'))) 
d <- plot(bin, main="" , colramp=my_colors, legend=F) 

Любые советы о том, как идти об этом было бы очень полезно.

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

Вы только создали один сюжет. Прочтите примеры построения смоделированных данных и добавьте код в тело quesiton, которое создает два набора данных, которые напоминают то, с чем вы работаете. –

ответ

7

Хорошо, в качестве отправной точки, вот некоторые выборочные данные. Каждый из них случайный, один сдвинут на (2,2).

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

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

Чтобы гарантировать, что контейнеры являются идентичными, то лучше построить один hexbin объект. Для этого я использую dplyrbind_rows, чтобы отслеживать, с какого data.frame были получены данные (это было бы еще проще, если бы у вас был единственный data.frame с переменной группировки).

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


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

Далее мы используем сочетание hexbin и dplyr для подсчета вхождений каждого в каждой клетке. Во-первых, примените через ящики, построив таблицу (необходимо использовать factor, чтобы убедиться, что все уровни показаны, не нужны, если ваш столбец уже является фактором). Затем он упрощает его и строит data.frame, который затем управляется с помощью mutate для вычисления разности в подсчетах, а затем соединяется обратно к таблице, которая дает значения 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 сам.

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

enter image description here

Оттуда, легко играть с осями, цветов и т.д.

Смежные вопросы