私はデータを持っています here [.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
ここで、外れ値のないプロットが必要です。これを行うには、最初に下限と上限のひげを計算します。推奨されるように、次のコードを使用します here 、
sts <- boxplot.stats(yp$x)$stats
外れ値を削除するには、以下のようにウィスカの上限と下限を追加します。
p1 = plt_wool + coord_cartesian(ylim = c(sts*1.05,sts/1.05))
結果のプロットを以下に示しますが、上記のコード行は、上位の外れ値のほとんどを正しく削除し、下位の外れ値はすべて残っています。誰かがこのプロットからすべての外れ値を完全に削除する方法を提案してもらえますか、ありがとう。
@Sven Hohenstein、@ Roland、@ lukeAの提案に基づいて、複数の箱ひげ図を外れ値なしで拡張形式で表示する問題を解決しました。
まず、geom_boxplot()
で_outlier.colour=NA
_を使用して、外れ値のないボックスプロットをプロットします
_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のウィスカ下限の半分を選択しました。
結果のプロットは以下です、
最小限の再現可能な例:
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のソリューションを使用してください。)
引数outlier.colour = NA
を使用して、外れ値を非表示にすることができます。
geom_boxplot(aes(color = factor(ID1)), outlier.colour = NA)
外れ値を除外する別の方法は、外れ値を計算してから、外れ値と見なすものにy制限を設定することです。
たとえば、上限と下限がQ3 + 1.5 IQR
および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))
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))