Как передать значения разрыва в stat_contour по фасету или группе - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь использовать библиотеку ks, чтобы вычислить домашний диапазон 95% для групп в наборе данных. Проблема заключается в том, что значения «разрыва», которые определяют отсечение для контуров 95%, различаются между группами. До сих пор я был в состоянии получить свои графики, но мне пришлось вручную добавлять значения перерывов для каждой группы / уровня, и я действительно хотел бы найти решение, в котором я могу создавать рисунки в ggplot, где значения разрыва импортируются автоматически.

require(ks)
require(dplyr)
require(ggplot2)

   # define the ks function to pass to a grouped_df 
ksFUN = function(data){

  H = Hpi(data[,c("x","y")], binned = TRUE) * 1

  fhata = kde(data[,c("x","y")], H = H, compute.cont = TRUE,
                  xmin = c(minX, minY), xmax = c(maxX, maxY))
  res95 = data.frame(HR = contourSizes(fhata, cont = 95, approx = TRUE))

  dimnames(fhata[['estimate']]) = list(fhata[["eval.points"]][[1]],
                                       fhata[["eval.points"]][[2]])
  dat = reshape2::melt(fhata[['estimate']])
  dat$breaks50 = fhata[["cont"]]["50%"]
  dat$breaks95 = fhata[["cont"]]["5%"]
  return(dat)
}
set.seed(100)


# create some data
df1 = data.frame(x = rnorm(100, 0, 5),
                 y = rnorm(100, 0, 5), 
                 Group = "Test1")
df2 = data.frame(x = rnorm(100, 10, 5),
                 y = rnorm(100, 10, 5), 
                 Group = "Test2")
df = rbind(df1, df2)

# Set the minimum and maximum x and y values outside 
# of the ksFUN to keep the data on the same scale
minX = min(df$x, na.rm = T); maxX = max(df$x, na.rm = T)
minY = min(df$y, na.rm = T); maxY = max(df$y, na.rm = T)

xx = df %>%
  group_by(Group) %>%
  do(as.data.frame(ksFUN(.)))


# extract the break value for the 95% contour (home range) and 50% (core area)
breaks = xx %>%
  group_by(Group) %>%
  summarize(breaks95 = mean(breaks95),
            breaks50 = mean(breaks50))

breaks



# The only way I have been able to add the breaks is to manually add them

ggplot(data = xx, aes(x = Var1, y = Var2, fill = Group)) +
  geom_point(data = df, aes(x = x, y = y, col = Group)) +
  stat_contour(data = xx[xx$Group == "Test1",], aes(z = value),
                         breaks = 0.000587, alpha = 0.3, geom = "polygon") +
  stat_contour(data = xx[xx$Group == "Test2",], aes(z = value),
                         breaks = 0.000527, alpha = 0.3, geom = "polygon")

enter image description here

Мне бы очень хотелось найти решение, в котором мне не нужно явно передавать значения разрыва в функции stat_contour

1 Ответ

0 голосов
/ 17 января 2019

Есть ли проблема с использованием столбца breaks в breaks? например,

# base plot
pl <- ggplot(data = xx, aes(x = Var1, y = Var2, fill = Group)) +
  geom_point(data = df, aes(x = x, y = y, col = Group))
groups <- unique(xx$Group)

# loop and add for each group
for(i in groups){
  pl <- pl + stat_contour(data = xx[xx$Group == i,], aes(z = value),
                          breaks = breaks[breaks$Group == i, ]$breaks, 
                          alpha = 0.3, geom = "polygon")
}
pl

Я получаю странные графики по краям, особенно когда я удаляю часть breaks из stat_contour, что наводит меня на мысль, что в ksFUN

может быть ошибка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...