Хорошо, в качестве отправной точки, вот некоторые примеры данных. Каждый из них случайный, один сдвигается на (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