【问题标题】:How to plot boxplot outliers in a stripplot instead?如何在条形图中绘制箱线图异常值?
【发布时间】:2019-07-30 15:52:34
【问题描述】:

我已经阅读了关于 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")

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

如下所示:

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

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

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 之间以及异常值的点。如果有人有其他方法来展示极端异常值的数据,我愿意接受建议。谢谢大家!

【问题讨论】:

  • 请发布引发该错误的尝试代码。
  • 完成,我添加了代码。我使用了我之前提供的链接中的确切代码来看看我是否可以模仿它 - 不能。

标签: r boxplot


【解决方案1】:

您收到错误 Error in FUN(X[[i]], ...) ...,因为您正在对整个 xin 应用 minmax 函数。如果您想在不遇到此错误的情况下运行提供的代码,则必须将这些函数仅应用于 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))

我首选的解决方案(假设您需要使用箱线图并包含所有提供的数据)是转换轴比例。以下代码将在 y 轴上绘制 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 的断轴的问题在于异常值非常极端,以至于单个断轴通常不会在同一图中生成带有Trial2Trial3 的干净图

【讨论】:

  • 我试过你的代码,但是当我输入最后一行时,它说找不到“log2_trans”函数。这是来自另一个包的吗?
  • log2_trans 在“scales”包中。如果您已经使用 install.packages("scales") 安装了 scales,请尝试在代码中将 log2_trans 替换为 scales::log2_trans
  • 好的,成功了! scale_y_continuous 是否也是我可以编辑比例的地方,现在图表本身看起来不错,但 y 轴比例令人困惑,我需要在主要刻度之间显示更多值。
  • 是的,scale_y_continuous 是您可以指定主要刻度之间的值的地方,例如: scale_y_continuous(trans = scales::log2_trans(), breaks = c(0.25, 0.5, 1.0, 2.0, 4.0 , 8.0, 16.0, 32,0) )
【解决方案2】:

当您尝试在整个数据帧上运行时,链接会使用值向量。考虑将宽数据框的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多