матрица диаграммы рассеяния с наложенным контурным графиком двумерной плотности застревает в решетке r

Я использую lattice для создания матрицы диаграммы рассеяния с наложенным контурным графиком двумерной функции плотности ядра. Следующий код дает странное поведение, когда контурные графики рисуются только частично, начиная снизу и обрезая вверху. Сколько будет нарисовано, зависит от значения n в MASS::kde2d.

library(lattice)
library(MASS)

splom(iris, upper.panel = function(x, y, ...) {
  if(is.numeric(x) & is.numeric(y)){

    # calculate bivariate kernel density 
    f1 <- kde2d(x = x, y = y, n = 20) #, lims = c(0, 10 ,0, 10))

    f <- data.frame(x = f1$x, y = rep(f1$y, each = length(f1$x)), 
                    z = as.vector(f1$z))

    panel.contourplot(x = f$x, y = f$y, z = f$z,  
                      contour = TRUE, ...)
    }
    panel.xyplot(x, y, ...)
  })

Поиск и печать сводок промежуточных значений, по-видимому, указывает на то, что функции ведут себя так, как ожидалось, и дают значения в ожидаемом диапазоне. Есть идеи, что происходит?


person Bryan    schedule 11.08.2015    source источник


Ответы (1)


Итак, получается, что ... передавал старый аргумент индексов в новую функцию панели. Поскольку данные iris имели 25 * 25 = 125 индексов, panel.contourplot учитывал только первые 125 элементов своих аргументов x, y и z. Об этом позаботится следующее.

splom(iris, upper.panel = function(x, y, subscripts, ...) {
  if(is.numeric(x) & is.numeric(y)){

    # calculate bivariate kernel density 
    v <- current.panel.limits() # allows full bleed by setting limits explicitly
    f1 <- kde2d(x = x, y = y, n = 50, lims = c(v$xlim, v$ylim))

    f <- data.frame(x = f1$x, y = rep(f1$y, each = length(f1$x)), 
                    z = as.vector(f1$z))
    panel.contourplot(f$x, f$y, f$z, contour = TRUE, 
                      subscripts = 1:dim(f)[1], ...)
  }
  panel.xyplot(x, y, subscripts = subscripts, ...)
})

Пока мы этим занимаемся, я добавил немного кода, чтобы levelplot занимало всю панель вместо неприятных белых рамок по краям. Намного лучше!

person Bryan    schedule 11.08.2015