Boxplot有几种分布?


9

我需要在R中的单个图形中绘制20个分布,即使使用boxwex = 0.3,对于常规boxplot(20个框)来说,它看起来也不好(混乱)。您能否建议我如何在R中绘制20种分布的箱形图,用点表示中位数,而用线代替盒形,如下图所示。如果有任何R方法可以产生不错的箱形图,尤其是要在单个图形中显示多个分布的情况,也请提出建议。

 -----0----

Answers:


12

(这实际上是评论,但由于需要插图,因此必须将其作为答复发布。)

埃德·图夫特(Ed Tufte)重新设计了定量信息的可视化显示(1983年,第一版,第125页)中的箱线图,以实现“非正式的探索性数据分析,研究人员的时间应专门用于绘图线以外的事情”。我已经(以一种完全自然的方式)扩展了他的重新设计,以适应此示例中显示70个平行箱形图的图纸异常值:

Tufte箱图

我可以想到几种进一步改进此方法的方法,但这是在探索复杂数据集的过程中可能产生的特征:我们满足于可视化以查看数据;好的演讲会在以后。

将此与相同数据的常规再现进行比较:

常规箱形图

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


您能帮忙在R中绘制顶部图形吗?
samarasa

1
@kkp这是草稿。好评(+1)。
chl

在R中还有其他可能性-在SO上可以找到:R中Tufte箱形图可用的功能?
chl

@chl谢谢您的链接。作为记录,它包含用于生成这些重新设计的箱线图的有效R代码。有趣的是,这个问题仅在发布之后的三天就发布了……
whuber

1
@无趣的观察。这种箱形图的一种潜在用途是Tukey的“徘徊原理图”的一种变体,其中(大)散点图沿x坐标切成薄片,y值由每个箱中的箱形图汇总。这样的过程可以轻松地生成70个或更多并排的箱形图。应用程序几乎包括所有多维数据:例如,x坐标可能代表每厘米采样的土壤深度,而y坐标可能代表在多个位置获得的数据。
ub

10

豆图

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

在R中可以很容易地实现Beanplots-只需安装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!

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 beanplot


3

以下是一些示例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) )

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.