4

我制作了一个我非常满意的多面情节,除了一个问题。在一些图上,一两个异常值完全破坏了图。我可以使用 y_lim 函数,但我使用的是 facet_grid(scales="free") 所以每个图都有一个唯一的限制。这是我的代码和它生成的图表。

melted_df <- melt(df, id='ca_rmsd')
ggplot(melted_df,aes(ca_rmsd,value)) + geom_point() 
       + facet_grid(varible ~.,scales="free")

生产
(来源:structbio.vanderbilt.edu 的 willisjr

正如您所看到的,顶部图有一个数据点 WAY 在轴之外,它粉碎了其余部分。

4

1 回答 1

2

这是一种可能性:

library(ggplot2)
n <- 1000
df <- data.frame(x=rnorm(n), y=rnorm(n),
                 label=sample(letters[1:4], size=n,
                   replace=TRUE))
df$y[1:50] <- 50  # Add some outliers

## Similar to your plot
ggplot(df, aes(x, y)) + geom_point() + facet_wrap(~ label)

library(plyr)
df.quantiles <- ddply(df, "label", summarise,
                      q99=quantile(y, probs=0.99),
                      q90=quantile(y, probs=0.90))
df <- merge(df, df.quantiles, by="label", all.x=TRUE)

## More or less what you want?
ggplot(df[df$y < df$q99, ],
       aes(x, y)) + geom_point() + facet_wrap(~ label)

这假设上面只有异常值,但您可以轻松地将其扩展为在下面执行相同的操作。

你可以尝试一些更复杂的东西,也许

df[df$y < df$q99 | (df$q99 / df$q90) < some.ratio, ]

您选择 some.ratio 以便只在 Y 被认为是异常值时丢弃最大的 1%,而不是一直丢弃。

希望有帮助。

于 2013-05-19T13:03:23.053 回答