如何在带状图中绘制箱形图离群值?

时间:2019-07-30 15:52:34

标签: r boxplot

我已经阅读了有关R箱形图和异常值的所有文章,我不能简单地删除/删除异常值,但是离群值很高,因此箱形图基本上就是线条。 我在类似的问题上看到了这篇文章:https://stats.stackexchange.com/questions/114744/how-to-present-box-plot-with-an-extreme-outlier

但是我对R的了解还不够,甚至不知道用来制作这些图的代码是什么。

这是我一直试图在不隐藏值的情况下保持美观的示例数据。

Inhibitor   Trial2   Trial3
grak         0.20     0.45
grab        11.00    31.55
hhus         0.21     0.18
hhuf        0.341     0.32
kkul         1.66     0.80
kkju         0.45     0.30
juik         0.30     0.20
jtui         0.80     0.40
test         0.233     0.36


boxplot(df$Trial1, df$Trial2, ylab="Rate", xlab="Trial")

Here is what my boxplot looks like

我也看到了这篇文章:https://stats.stackexchange.com/questions/63203/boxplot-equivalent-for-heavy-tailed-distributions,并试图使这种情况发生在我的数据上,但是我不知道如何使它以大于1 x的值工作,并且几乎每个步骤都会出错的方式。弹出的主要错误是在我遵循了最后一个示例并尝试创建箱形图之后。

如下所示:

enter image description here

我也在尝试制作此示例图,因为这是一个看起来也不错的选项(如下):

enter image description here

我使用了这段代码,但出现以下错误:

df <- read.csv("Inhibitor.csv", header=TRUE)
xout <- boxplot(df$Trial1, df$Trail2, horizontal=TRUE)$out
xin <- df[!(df %in% xout)]
noutl1 <- sum(xout<median(df$Trial1))
noutl2 <- sum(xout<median(df$Trail2))
nouth1 <- sum(xout>median(df$Trial1))
nouth2 <- sum(xout>median(df$Trail2))
boxplot(xin, horizontal=TRUE, ylim=c(min(xin)*1.15, max(xin)*1.15))

Error in FUN(X[[i]], ...) : 
  only defined on a data frame with all numeric variables

我基本上希望我的主箱形图具有视觉吸引力(ylimits在0到10之间),然后在顶部添加一个带状图,ylimits在10到30之间,以及异常点。如果有人还有其他方法可以极端极端地展示数据,我愿意提出建议。谢谢大家!

2 个答案:

答案 0 :(得分:0)

由于在整个Error in FUN(X[[i]], ...) ...上应用了minmax函数,因此出现错误xin。如果要运行提供的代码而不遇到此错误,则必须使用以下代码将这些函数仅应用于xin data.frame的数字列:

boxplot(xin$Trial1, horizontal=TRUE, ylim=c(min(c(xin$Trial1, xin$Trial2))*1.15, max(c(xin$Trial1, xin$Trial2))*1.15))

我的首选解决方案(假设您需要使用箱线图并包含所有提供的数据)将是转换轴刻度。以下代码将在{轴上绘制Rate,其刻度为2(2 ^ x)。

library(ggplot2)
library(tidyr)
library(scales)

df <- data.frame(
  Inhibitor= c("grak", "grab", "hhus", "hhuf", "kkul", "kkju", "juik", "jtui", "test"),
  Trial2 = c(0.20, 11.00, 0.21, 0.341, 1.66, 0.45, 0.30, 0.80, 0.233),
  Trial3 = c(0.45, 31.55, 0.18, 0.32, 0.80, 0.31, 0.20, 0.40, 0.36)
)
#Gather the `Trial2` and `Trial3` columns to prepare for ggplot2


df2 <- gather(df, `Trial2`, `Trial3`, key="Trial", value = "Rate")

#plot with ggplot2

ggplot(data = df2, mapping = aes(x = Trial, y = Rate))+
  stat_boxplot(geom = 'errorbar')+
  geom_boxplot()+
  scale_y_continuous(trans = log2_trans())

另一种选择是使用诸如plotrix之类的库来创建轴断线的箱线图,其代码如下:

library(plotrix)
gap.boxplot(df$Trial2, df$Trial3, gap=list(top=c(11.50, 31.00),bottom=c(NA,NA)))

使用带有plotrix的断轴来处理此数据的问题在于,异常值非常极端,以至于单个断轴通常不会同时产生Trial2和{{1}的清晰图}在同一情节中

答案 1 :(得分:0)

当您尝试在整个数据帧上运行时,Link使用值的向量。将宽数据框中的reshape考虑为长格式,然后运行绘图。还请考虑boxplot.stats,并避免使用不必要的boxplot绘图输出:

rdf <- reshape(df, 
               varying=list(paste0("Trial", 1:2)), 
               v.names = "Trial",                
               times=paste0("Trial", 1:2), 
               timevar="Indicator",
               direction="long")

x <- rdf$Trial
xout <- boxplot.stats(x, coef=3)$out
xin <- rdf[!(rdf$Trial %in% xout),]
nouth <- sum(xout < median(xin$Trial))
noutl <- sum(xout > median(xin$Trial))
boxplot(Trial ~ Indicator, xin, horizontal=TRUE, 
        ylim=c(min(xin$Trial)*1.15, max(xin$Trial)*1.15))
text(x=max(xin$Trial)*1.17, y=1, labels=paste0(as.character(nouth)," >"))
text(x=min(xin$Trial)*1.17, y=1, labels=paste0("< ",as.character(noutl)))

Rextester Demo

Plot Output