17

我在这里有一些数据[在 .txt 文件中],我将其读入数据框 df,

df <- read.table("data.txt", header=T,sep="\t")

我使用以下代码删除列中的负值x(因为我只需要正值) ,df

yp <- subset(df, x>0)

现在我想在同一层绘制多个箱线图。我首先融化了数据框df,结果图包含几个异常值,如下所示。

# Melting data frame df    
df_mlt <-melt(df, id=names(df)[1])
    # plotting the boxplots
    plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
      geom_boxplot(aes(color=factor(ID1))) +
      scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +    
      theme_bw() +
      theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
      theme(axis.text=element_text(size=20)) +
      theme(axis.title=element_text(size=20,face="bold")) +
      labs(x = "x", y = "y",colour="legend" ) +
      annotation_logticks(sides = "rl") +
      theme(panel.grid.minor = element_blank()) +
      guides(title.hjust=0.5) +
      theme(plot.margin=unit(c(0,1,0,0),"mm")) 
    plt_wool

带有异常值的箱线图

现在我需要有一个没有任何异常值的图,所以首先我计算下限和上限晶须,我使用以下代码,如下所示

sts <- boxplot.stats(yp$x)$stats

为了消除异常值,我添加了上下晶须限制,如下所示,

p1 = plt_wool + coord_cartesian(ylim = c(sts*1.05,sts/1.05))

结果图如下所示,而上面的代码行正确地删除了大部分顶部异常值,所有底部异常值仍然存在。有人可以建议如何从这个情节中完全删除所有异常值,谢谢。

在此处输入图像描述

4

5 回答 5

23

一个最小的可重现示例:

library(ggplot2)
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot()

不绘制异常值:

p + geom_boxplot(outlier.shape=NA)
#Warning message:
#Removed 3 rows containing missing values (geom_point).

(我更喜欢收到这个警告,因为一年后有一个很长的脚本会提醒我我在那里做了一些特别的事情。如果你想避免它,请使用 Sven 的解决方案。)

于 2014-02-03T17:08:59.697 回答
16

根据@Sven Hohenstein、@Roland 和@lukeA 的建议,我已经解决了以扩展形式显示多个箱线图而没有异常值的问题。

outlier.colour=NA首先使用in绘制没有异常值的箱线图geom_boxplot()

plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
  geom_boxplot(aes(color=factor(ID1)),outlier.colour = NA) +
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
  theme_bw() +
  theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
  theme(axis.text=element_text(size=20)) +
  theme(axis.title=element_text(size=20,face="bold")) +
  labs(x = "x", y = "y",colour="legend" ) +
  annotation_logticks(sides = "rl") +
  theme(panel.grid.minor = element_blank()) +
  guides(title.hjust=0.5) +
  theme(plot.margin=unit(c(0,1,0,0),"mm"))

boxplot.stats()然后使用下面的代码计算下、上胡须。由于我只考虑正值,因此我使用subset().

yp <- subset(df, x>0)             # Choosing only +ve values in col x
sts <- boxplot.stats(yp$x)$stats  # Compute lower and upper whisker limits

coord_cartesian()现在要实现多个箱线图的完整扩展视图,修改 plot inside函数的 y 轴限制是很有用的,如下所示,

p1 = plt_wool + coord_cartesian(ylim = c(sts[2]/2,max(sts)*1.05))

注: y 的限值应根据具体情况进行调整。在这种情况下,我为 ymin 选择了晶须下限的一半。

结果图如下,

于 2014-02-04T09:37:54.433 回答
4

您可以使用参数使异常值不可见outlier.colour = NA

geom_boxplot(aes(color = factor(ID1)), outlier.colour = NA)
于 2014-02-03T17:08:53.607 回答
4

排除异常值的另一种方法是计算它们,然后将 y 限制设置为您认为的异常值。

例如,如果您的上限和下限是Q3 + 1.5 IQR and Q1 - 1.5 IQR,那么您可以使用:

upper.limit <- quantile(x)[4] + 1.5*IQR(x)
lower.limit <- quantile(x)[2] - 1.5*IQR(x)

然后限制 y 轴范围:

ggplot + coord_cartesian(ylim=c(lower.limit, upper.limit))
于 2014-11-11T02:06:58.443 回答
3
ggplot(df_mlt, aes(x = ID1, y = value)) + 
  geom_boxplot(outlier.size = NA) + 
  coord_cartesian(ylim = range(boxplot(df_mlt$value, plot=FALSE)$stats)*c(.9, 1.1))
于 2014-02-03T17:24:48.613 回答