几个分布的箱线图?

机器算法验证 r 箱形图
2022-03-30 03:07:46

我需要在 R 中的一个图中绘制 20 个分布,即使使用 boxwex=0.3,使用常规箱线图(20 个框)对我来说看起来也不太好(杂乱无章)。你能建议我如何在 R 中为 20 个分布绘制一种箱线图,点表示中位数,只有一条线而不是框,如下图所示。如果有任何 R 方法可以产生漂亮的箱线图,也请建议我,特别是如果您想在单个图中显示多个分布。

 -----0----
3个回答

(这确实是一个评论,但因为它需要插图,所以必须作为回复发布。)

Ed Tufte在他的Visual Display of Quantitative Information(第 125 页,1983 年第一版)中重新设计了箱线图,以实现“非正式的、探索性的数据分析,研究人员的时间应该用于画线以外的事情”。我已经(以一种非常自然的方式)扩展了他的重新设计以适应在这个示例中绘制异常值,显示 70 个平行箱线图:

塔夫特箱线图

我可以想出几种方法来进一步改进这一点,但这是一个人在探索复杂数据集时可能产生的特征:我们满足于进行可视化,让我们看到数据;好的演示文稿可以稍后来。

将此与相同数据的传统再现进行比较:

常规箱线图

Tufte 根据他的“最大化数据墨水比率”的原则提出了其他几个重新设计。它们的价值在于说明这一原则如何帮助我们设计有效的探索性图形。如您所见,绘制它们的机制相当于找到任何可以绘制点标记和线的图形平台。

豆图

可能是有史以来最酷的情节,这些基本上是小提琴情节的小倍数实现。小提琴图比箱线图有一个巨大的优势:它们可以为非正态分布显示更多细节(例如,它们可以很好地显示双峰分布)。因为它们通常基于高斯平滑(或类似的),所以它们对于具有高端点的分布(如指数分布)不会很好地工作,但是,箱线图也不会。

Beanplots 可以很容易地在 R 中实现 - 只需安装beanplot包:

library(beanplot)

# Sampling code from Greg Snow's answer:
my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

beanplot(my.dat)

豆图!

beanplot功能有大量选项,因此您可以根据自己的意愿对其进行自定义。还有一种方法可以在ggplot2 中进行 beanplots(需要最新版本):

library(ggplot2)

my.dat <- lapply(1:20, function(x) rnorm(x+10, sample(10, 1), sample(3,1)))
my.df <- melt(my.dat)
ggplot(my.df, aes(x=L1, y=value, group=L1)) + geom_violin(trim=FALSE) +
  geom_segment(aes(x=L1-0.1, xend=L1+0.1, y=value, yend=value), colour='white')

GGplot2 豆图

这是一些示例 R 代码,有几种方法可以做到这一点,您可能希望对此进行扩展(包括标签等),并可能将其转换为函数:

my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

tmp <- boxplot(my.dat, plot=FALSE, range=0)

# box and median only
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[2,], seq_along(my.dat), tmp$stats[4,] )
points( tmp$stats[3,], seq_along(my.dat) )

# wiskers and implied box
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[1,], seq_along(my.dat), tmp$stats[2,] )
segments( tmp$stats[4,], seq_along(my.dat), tmp$stats[5,] )
points( tmp$stats[3,], seq_along(my.dat) )

在此处输入图像描述