Довольно плохо знаком с R и застрял.Я пытаюсь нормализовать двумерную плотность вероятности тепловой карты, вычитая двумерную плотность вероятности из другого набора данных.Я смотрю, где поведение происходит в космосе, однако, чтобы сделать это, я хочу вычесть то, от чего испытуемые просто проводят большую часть своего времени, когда поведение происходит, чтобы получить представление об относительной плотности только поведения.Чтобы сделать это, я пытаюсь найти матрицы плотности вероятности, используемые для построения тепловой карты для следующего кода:
ctrlplot<-ctrl %>% ggplot(aes(x=x, y=y)) +
stat_density_2d(geom = "raster", aes(fill = stat(density)), contour = FALSE)+
scale_fill_gradientn(colours=matlab.like(15), na.value = "gray",
as lowertick, uppertick, interval
limit=c(0,1.3e-05)) #sets the static limit of probabilities.
Это работает для построения тепловой диаграммы для любого набора данных, однако я не могу найти, где ggplotили stat_density_2d хранит данные плотности, чтобы вычесть их.
В качестве альтернативы я попытался получить только плотности для обоих наборов данных, используя следующий код и сохранив его как переменную dens:
n<-100
h<-c(bandwidth.nrd(ctrl$x),bandwidth.nrd(ctrl$y))
dens<-kde2d(ctrl$x,ctrl$y,n=n,h=h)
Теперь я не уверен, как вычесть результирующиеz значения и вернуть его в тепловой график.Я знаю, что, вероятно, есть простое решение для этого, но я определенно застрял.Будем очень благодарны за любые советы о том, как это сделать проще, или за другие советы о том, как вычитать плотности друг от друга.
ОБНОВЛЕНИЕ: я нашел способ получить данные о плотности из ggplot.Мне удалось получить данные плотности из двух разных наборов данных, вычесть векторы и поместить плотности обратно в исходный кадр данных, используя следующий код:
ctrlplot<-ctrl %>% ggplot(aes(x=x, y=y)) +
stat_density_2d(geom = "raster", aes(fill = stat(density)), contour = FALSE)+
scale_fill_gradientn(colours=matlab.like(15), na.value = "gray")
ctxplot<-ctx %>% ggplot(aes(x=x, y=y)) +
stat_density_2d(geom = "raster", aes(fill = stat(density)), contour = FALSE)+
scale_fill_gradientn(colours=matlab.like(15), na.value = "gray")
ctrlplot2<-ggplot_build(ctrlplot)
gbctrl<-ctrlplot2$data[[1]]
densctrl<-gbctrl$density
gbctx<-ggplot_build(ctxplot)
gbctx<-gbctx$data[[1]]
densctx<-gbctx$density
diff_ctrl_ctx<-densctrl-densctx
gbctrl$density<-diff_ctrl_ctx
ctrlplot2$data[[1]]<-gbctrl
ctrlplot2
ctrlplot
Однако последние два графика ctrlplot (оригинал)и ctrlplot2 (вычтенные плотности) дают тот же график.Не уверен, что я не заменяю правильные части фрейма данных, чтобы он обновлялся для графической части, поскольку в исходном ggplot_build есть разные списки.