“把手”图的替代图形

机器算法验证 数据可视化
2022-02-16 07:10:56

在我的研究领域,显示数据的一种流行方式是使用条形图与“把手”的组合。例如,

在此处输入图像描述

根据作者的不同,“把手”在标准误差和标准偏差之间交替。通常,每个“条”的样本量相当小——大约六个。

这些图似乎在生物科学中特别流行——例如,参见BMC Biology 第 3 卷的前几篇论文。

那么你将如何呈现这些数据呢?

为什么我不喜欢这些情节

我个人不喜欢这些情节。

  1. 当样本量很小时,为什么不只显示单个数据点。
  2. 显示的是 sd 还是 se?没有人同意使用哪个。
  3. 为什么要使用酒吧。数据不会(通常)从 0 开始,但图表上的第一次通过表明它确实如此。
  4. 这些图表没有给出关于数据范围或样本大小的概念。

R 脚本

这是我用来生成绘图的 R 代码。这样您就可以(如果您愿意)使用相同的数据。

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)
4个回答

感谢您的所有回答。为了完整起见,我认为我应该包括我通常做的事情。我倾向于结合给出的建议:点、箱线图(当 n 很大时)和 se(或 sd)范围。

被版主删除,因为托管图像的网站似乎不再正常工作。

从点图中可以清楚地看出,数据比“手柄条”图所建议的要分散得多。其实A3里面有一个负值!


我已将此答案设为 CW,因此我不会获得代表

弗兰克·哈雷尔(Frank Harrell)的(最优秀的)主题演讲题为“信息过敏”在 userR!上个月展示了这些替代方案:不是通过条形提供的聚合隐藏原始数据,原始数据也显示为点(或点)。“为什么要隐藏数据?” 是弗兰克的评论。

考虑到 alpa 混合,这是一个最明智的建议(整个谈话充满了好的、重要的掘金)。

从心理学的角度来看,我主张绘制数据加上你对数据的不确定性。因此,在您展示的情节中,我永远不会费心将条形一直延伸到零,这只会最小化眼睛区分数据范围差异的能力。

另外,坦率地说,我反对条形图。条形图将两个变量映射到相同的美学属性(x 轴位置),这可能会导致混淆。一种更好的方法是通过将一个变量映射到 x 轴并将另一个变量映射到另一个美学属性(例如点形状或颜色或两者)来避免多余的美学映射。

最后,在上面的图中,您只包含高于值的误差线,这妨碍了比较与高于和低于值的柱相关的不确定性区间的能力。

这是我绘制数据的方式(通过 ggplot2 包)。请注意,我在同一系列中添加了连接点的线;有人认为这仅适用于连接线的系列是数字的(在这种情况下似乎是这样),但是只要 x 轴变量的水平之间存在任何合理的序数关系,我认为连接线有助于帮助眼睛在 x 轴上关联点。这对于检测交互特别有用,这在线条中非常突出。

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

在此处输入图像描述

我很好奇你为什么不喜欢这些情节。我一直在使用它们。不想说明开花明显,它们允许您比较不同组的平均值并查看它们的 95% CI 是否重叠(即,真实平均值可能不同)。

我想,为了不同的目的,在简单性和信息之间取得平衡是很重要的。但是当我使用这些图时,我是在说-“这两组在某些重要方面彼此不同”[或没有]。

对我来说似乎很棒,但我很想听听反例。我认为该图的使用隐含的是数据没有奇异的分布,这使得平均值无效或具有误导性。