【问题标题】:In a boxplot, how to show that outliers exist, but not actually plot them?在箱线图中,如何显示异常值存在,但实际上并未绘制它们?
【发布时间】:2023-04-10 07:12:01
【问题描述】:

在我们的数据集中,我们有一些绝对巨大的异常值。如果我们绘制(例如在箱线图中)并包含异常值,则轴将被挤压以致于无用。对数缩放没有帮助。但我们想告诉读者存在异常值(并说明有多少,以及在箱线图的哪一侧,正面或负面),最好不要在标题中手动添加文本。有什么好的方法吗?最好在 R、Matplotlib 或 Seaborn 中。

这与例如Ignore outliers in ggplot2 boxplot 不同,因为我不想忽略异常值:我想证明它们存在,但不绘制它们。

示例代码:

# from https://stackoverflow.com/questions/5677885/ignore-outliers-in-ggplot2-boxplot
> library("ggplot")
> df = data.frame(y = c(-100, rnorm(100), 100))
> ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

由于存在异常值,我们看到了一个无用的箱线图。如果我们按照该链接上接受的答案,我们会以一种非常好的方式删除异常值,但现在读者没有意识到有任何异常值。

编辑几个 cmets/answers 问我真正想要什么,但这正是困难所在——我知道我想要一个异常值的自动图形表示(连同主要数据),但我不知道是什么这应该看起来像,正是。我希望社区中有人知道这种情况的一些最佳实践。我不需要帮助编写代码来查找异常值或在绘图中添加文本。

【问题讨论】:

  • 你能发布一些示例数据和一些基本代码来可视化问题吗?
  • @ThomasKühn,添加了代码。
  • @Wimpel,不是编辑中描述的重复项。
  • 我认为没有既定的惯例。一个想法:将所有异常值画成红色,并在边界附近放置一个红色箭头以表示债券外异常值,可选择将其值放在箭头旁边,用精美的红色打印

标签: r matplotlib seaborn outliers


【解决方案1】:

基本函数boxplot.stats() 是您所需要的。有关如何识别异常值的详细信息,请参阅帮助功能。这是查找和报告异常值存在的一种方法。

  set.seed(123) # make reproducible
  y <- c(rnorm(3, -100), rnorm(3, 100), rnorm(100, 1))
  y <- sample(y) # mix 'em up
  out <- boxplot.stats(y)$out # find outliers
  lo <- out[out < median(y)] # collect low
  hi <- out[out > median(y)] # collect high
  sel.lo <- which(y %in% lo) # collect positions of low
  sel.hi <- which(y %in% hi) # collect positions of high

# Report on what was found
  sprintf("%d low outliers and %d high outliers found",
    length(lo), length(hi))
# [1] "3 low outliers and 3 high outliers found"

您可以将sel.losel.hi 标识的值替换为更合理距离处的占位符以用于绘图目的。当然,更改数据并重新应用箱线图可能会更改统计数据并更改异常值的定义。

如果保留原始箱线图属性但没有异常值影响很重要,则可以使用 boxplot.stats 中的值设置绘图比例。

  ylim <- 1.1 * boxplot.stats(y)$stats[c(1, 5)] # ends of the whiskers
  par(mfrow = c(1,2), las = 2, mar = c(1, 4, 3, 1))
  boxplot(y, main = "All data")
  boxplot(y, ylim = ylim, main = "Outliers ignored")

【讨论】:

  • 好吧,“我们想告诉读者存在异常值(并说明有多少,以及在箱线图的哪一侧,正面或负面),最好不要在标题中手动添加文本”。 sprintf() 告诉代码作者,而不是情节读者。当然,这是通过手动将文本添加到绘图中。
  • 我不确定您所说的“手动”是什么意思,以及您希望如何向读者传达这些信息。此信息位于losel.lohisel.hisprintf 代码只是说明了如何以编程方式提取它。 (并证明它有效!)提取的信息可用于修改现有数据框中的数据。或者,将其放置在另一个 data.frame 中,该框架可用于通过您最喜欢的 geom_xxx 函数在 ggplot 中添加另一层。如果您提供一个您希望如何传达信息的示例,也许有人可以提出建议。
  • 感谢查看编辑。我想要自动图形演示,但我不知道它应该是什么样子。
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2023-03-19
  • 2023-03-12
相关资源
最近更新 更多