具有双变量密度重叠等高线图的散点图矩阵卡在格子 r 中
scatterplot matrix with overlaid contourplot of bivariate density gets stuck in lattice r
我正在使用 lattice
创建一个散点图矩阵,其中包含双变量核密度函数的重叠等高线图。以下代码给出了一个奇怪的行为,其中等高线图仅部分绘制,从底部开始并在顶部被切断。抽取多少取决于 MASS::kde2d
中 n
的值。
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, ...)
})
查看和打印中间值的摘要似乎表明函数的行为符合预期,并且给出的值在预期范围内。知道发生了什么事吗?
好的,结果是 ...
将旧的下标参数传递给了新的面板函数。由于 iris
数据有 25*25 = 125 个下标,panel.contourplot
仅考虑其 x
、y
和 z
参数的前 125 个元素.以下内容将解决这个问题。
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
占据整个面板,而不是在边缘周围出现令人讨厌的白色边框。好多了!
我正在使用 lattice
创建一个散点图矩阵,其中包含双变量核密度函数的重叠等高线图。以下代码给出了一个奇怪的行为,其中等高线图仅部分绘制,从底部开始并在顶部被切断。抽取多少取决于 MASS::kde2d
中 n
的值。
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, ...)
})
查看和打印中间值的摘要似乎表明函数的行为符合预期,并且给出的值在预期范围内。知道发生了什么事吗?
好的,结果是 ...
将旧的下标参数传递给了新的面板函数。由于 iris
数据有 25*25 = 125 个下标,panel.contourplot
仅考虑其 x
、y
和 z
参数的前 125 个元素.以下内容将解决这个问题。
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
占据整个面板,而不是在边缘周围出现令人讨厌的白色边框。好多了!