自动设置ylim()

时间:2015-06-15 07:45:55

标签: r scatter-plot outliers

以下是一些可以使用的数据。

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)

enter image description here

然后我总是可以编写下面的代码来删除y轴异常值。

plot(df$x2,df$x1,ylim=c(0,800))

enter image description here

所以我的问题是:有没有办法在散点图中自动排除明显的异常值?就像ouline=F一样,如果我要绘制一个例子的箱形图。据我所知,outline=F并不适用于散点图。

这是相关的,因为我有数百个散点图,我想排除所有明显的外围数据点而不为每个散点图设置ylim(...)

2 个答案:

答案 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))

绘制每个数据框