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).

(私はこの警告を受け取りたいと思っています。なぜなら、今から 1 年後に長いスクリプトを使用すると、そこで何か特別なことをしたことを思い出してしまうからです。回避したい場合は、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()以下のように関数内のプロットの 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 IQRQ1 - 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 に答える