我想将一些数据绘制为带有点阵的散点图矩阵。但是,数据包含一些异常值。这导致主要数据的非常紧凑的情节。我想从图中删除异常值。观察可以是一个测量变量的异常值,但不是另一个测量变量的异常值,因此对于矩阵内的每个单个散点图,需要计算要去除的异常值。由于异常值构成了大约10,000个中的最大10个观测值,因此我想要简单地删除每个变量的最低值的10个观测值(异常值通常是更负方向的值)。我知道我必须修改面板功能,但我仍然坚持如何做到这一点。另外,我的下面板是一个hexbinplot,所以它也应该修改,我希望这将以相同的方式工作。有没有人有想法?
MWE:
require(lattice)
require(hexbin)
data(iris)
iris.out <- iris
iris.out[2,1] <- 1
iris.out[3,1] <- .2
iris.out[4,2] <- .1
iris.out[5,2] <- .2
splom(~iris.out[1:4], groups = Species, data = iris,
lower.panel = function(...,groups){
panel.hexbinplot(xbins = 20,
colramp = function(n){heat.ob(n, beg=15, end=225)},...,groups=NULL)
},
diag.panel = function(x,...){
yrng <- current.panel.limits()$ylim
d <- density(x, na.rm = TRUE)
d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y))
panel.lines(d, col = "darkgrey")
diag.panel.splom(x, ...)
}
)
答案 0 :(得分:1)
我也许有一个部分解决方案。对于双变量图,我在x和y中删除了由最低10个观测值定义的异常值。此外,'groups'因子仅在上面板中实现。
splom(~iris.out[1:4],
lower.panel=function(x,y,...){
x.out=order(x,decreasing=FALSE)[1:10]
y.out=order(x,decreasing=FALSE)[1:10]
out=c(x.out,y.out)
x=x[-out]
y=y[-out]
panel.hexbinplot(x,y, xbins =20,colramp = function(n){heat.ob(n, beg=15, end=225)},...)
},
diag.panel = function(x,...){
x=x[-order(x,decreasing=FALSE)[1:10]]
yrng <- current.panel.limits()$ylim
d <- density(x, na.rm = TRUE)
d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y))
panel.lines(d, col = "darkgrey")
diag.panel.splom(x, ...)
},
upper.panel=function(x,y,groups=iris$Species,...){
x.out=order(x,decreasing=FALSE)[1:10]
y.out=order(x,decreasing=FALSE)[1:10]
out=c(x.out,y.out)
x=x[-out]
y=y[-out]
panel.splom(x,y,groups=iris$Species,...)
}
)