如何更好地绘制和比较重叠直方图?

机器算法验证 数据可视化 直方图
2022-04-08 06:18:12

我想比较 3 个不同时间跨度的分布:

叠加直方图

所以我将直方图与模型曲线一起绘制。

但我担心重叠的直方图会让每个人都很难看到。直方图也设置为半透明,因此可以看到重叠。但这也使颜色重叠,难以区分。

另一个问题是,我还想比较直方图的引导结果,所以我重新采样并绘制了很多次:

叠加自举直方图

我相信这也是很难看到的。

我想知道,绘制这种比较的好方法是什么?我该怎么做才能使情节更清晰?

2个回答

显示“重叠”直方图的 usua 替代方法是:

  • 并排放置栏(但我认为在大多数情况下它在视觉上效果不佳):

在此处输入图像描述

  • 用一条线连接条的高度(并放下条本身 - 存在绘制直方图轮廓的替代方案,如天际线):

在此处输入图像描述

我正在添加用于制作数字的 R 代码:

dataf <- bind_rows(lapply(1:10, 
                          function(x) {
                              data.frame(grp=x,
                                         value=rnorm(100,
                                                     mean=runif(1)))
                          }))

ggplot(dataf) + 
  geom_histogram(aes(x=value, fill=factor(grp)),
                 position="dodge", binwidth=.5)

ggplot(dataf) + 
  geom_freqpoly(aes(x=value, color=factor(grp)), binwidth=.5)

将直方图绘制在一起可能很好,但是当您有两个以上的直方图或它们重叠的次数越多时,它就会崩溃,这两种情况都适用于您的情况。我建议你从制作一个绘图矩阵开始(只要你没有这么多组,绘图变得不可用)。

同样,具有太多且太不同的对象的情节可能会变得难以解释。您想要比较直方图,并且想要比较核密度图。请注意,绘图矩阵的每个组都有一条主对角线,然后上下三角形是对称的。对于比较两组的上三角中的给定图,下三角中有一个比较相同两组的对应图。因此,我建议您比较上三角图中的直方图和下三角图中的核密度图。

因为可能仍然难以比较子图中的两个重叠直方图,所以我建议您制作背靠背直方图而不是重叠直方图。

把这些建议放在一起,你会得到这样的结果:

在此处输入图像描述

这是使用R. 双直方图代码改编自这里我怀疑代码对于那些还不是很熟悉的人来说是无法解释的R,但是对于那些确实想看它的人来说,它显示在下面:

data(mtcars)
d  = mtcars[,c("qsec","cyl")]
ud = unstack(d)
ud = data.frame(four  = c(ud[[1]], rep(NA,3)),
                six   = c(ud[[2]], rep(NA,7)),
                eight =   ud[[3]]             )

upper = function(x, y){
  usr = par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1), new=TRUE)
  hx        = hist(x, plot=FALSE)
  hy        = hist(y, plot=FALSE)
  lim       = ifelse(max(hy$counts)>max(hx$counts), max(hy$counts), max(hx$counts))
  hy$counts = - hy$counts
  plot(hy, ylim=c(-lim, lim), col="red", xlim=c(14,23), axes=FALSE, main="")
  lines(hx, col="blue")
  abline(h=0)
}
diag.hist = function(x, ...){
  usr = par("usr"); on.exit(par(usr)); par(usr=c(usr[1:2], 0, 1.5), new=TRUE)
  hist(x, freq=FALSE, xlim=c(14,23), ylim=c(0,.8), main="", axes=FALSE)
  lines(density(na.omit(x)))
}
lower = function(x, y){
  usr = par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1), new=TRUE)
  plot( density(na.omit(x)), xlim=c(14,23),ylim=c(0,.5),main="",axes=FALSE, col="blue")
  lines(density(na.omit(y)), col="red")
}

windows()
  pairs(ud, upper.panel=upper, diag.panel=diag.hist, lower.panel=lower)