Матрица рассеяния с наложенным контурным графиком двумерной плотности застревает в решетке 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, ...)
})
Просмотр и печать сводных данных о промежуточных значениях, кажется, указывают на то, что функции ведут себя как ожидалось и дают значения в ожидаемом диапазоне. Есть идеи, что происходит?
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
возьмите всю панель вместо того, чтобы иметь противные белые границы по краям. Намного лучше!