R - разностная диаграмма рассеяния

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

Вот мои два сюжета:

введите здесь описание изображениявведите здесь описание изображения

и мой скрипт для сюжетов:

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)

person EA00    schedule 22.10.2016    source источник
comment
Вы создали только один сюжет. Прочтите примеры построения смоделированных данных и добавьте в тело вопроса код, который создает два набора данных, похожих на те, с которыми вы работаете.   -  person IRTFM    schedule 22.10.2016


Ответы (1)


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

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

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

Чтобы убедиться, что контейнеры идентичны, лучше всего построить один объект hexbin. Для этого я использую dplyr bind_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 = bothHex@cell, 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()

введите описание изображения здесь

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

person Mark Peterson    schedule 25.10.2016