以下是一些可以使用的数据。
df <- data.frame(x1=c(234,543,342,634,123,453,456,542,765,141,636,3000),x2=c(645,123,246,864,134,975,341,573,145,468,413,636))
如果我绘制这些数据,它将生成一个带有明显异常值的简单散点图:
plot(df$x2,df$x1)
然后我总是可以编写下面的代码来删除y轴异常值。
plot(df$x2,df$x1,ylim=c(0,800))
所以我的问题是:有没有办法在散点图中自动排除明显的异常值?就像ouline=F
一样,如果我要绘制一个例子的箱形图。据我所知,outline=F
并不适用于散点图。
这是相关的,因为我有数百个散点图,我想排除所有明显的外围数据点而不为每个散点图设置ylim(...)
。
答案 0 :(得分:0)
您可以编写一个函数,返回您定义为明显异常值的索引。然后在绘图之前使用该函数对数据进行子集化。
这里排除了“a”超过5 *中位数“a”的所有观察结果。
df <- data.frame(a = c(1,3,4,2,100), b=c(1,3,2,4,2))
f <- function(x){
which(x$a > 5*median(x$a))
}
with(df[-f(df),], plot(b, a))
答案 1 :(得分:0)
没有简单的是/否选项来执行您正在寻找的内容(定义通用散点图的“明显异常值”的问题可能存在问题)。
也就是说,编写一个合理的函数从一组数据点给出y轴限制应该不会太困难。如果我们将“明显的异常值”表示y值显着高于或低于样本大部分的点(假设x值足够分布可以证明是合理的),那么你可以使用像:
ybounds <- function(y){ # y is the response variable in the dataframe
bounds = quantile(df$x1, probs=c(0.05, 0.95), type=3, names=FALSE)
return(bounds + c(-1,1) * 0.1 * (bounds[2]-bounds[1]) )
}
然后使用plot(df$x, df$y, ylim=ybounds(df$y))