“把手”图的替代图形


15

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

在此处输入图片说明

根据作者的不同,“把手”在标准误差和标准偏差之间交替显示。通常,每个“条”的样本大小都非常小-大约六个。

这些图似乎在生物科学中特别受欢迎-例如,请参阅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)

6
帮助您的领域就se v。sd问题达成共识将是巨大的进步。他们的意思完全不同。
约翰

我同意-通常选择se是因为它提供了较小的区域!
csgillespie

也许一些更翔实的标题?

3
仅供参考,我以前看过这些带有错误条形图的“炸药图”条形图。以下是一些参考,它们给出了与其他人几乎完全一样的建议(点状图)。小山树( Tatsuki Koyama),当心炸药海报德拉蒙德&威勒(Drummond&Vowler),2011年
2012年

1
如果可以,请再次添加图像。这次使用图片上传器,这样它就不会成为无效链接。
endolith 2013年

Answers:


16

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

由主持人删除,因为托管该图像的站点似乎不再正常工作。

从点图可以明显看出,数据在“把手”图建议的范围内散布得多。实际上,A3中有一个负值!


我已将此答案设为CW,所以我没有获得代表


3
这是一个很好的答案。另外,我建议水平晃动这些点,这样它们就不会重叠,特别是如果每​​个组中的点比该点多的话。在ggplot2中,geom_jitter()将执行此操作。
哈兰2010年

@哈伦:我同意。虽然如果我有更多点,我可能会使用箱线图。
csgillespie 2010年

1
我也喜欢小型数据集的散点图(nb,我使用术语“点图”来指代略有不同的图)。但是,就其价值而言,上面的小节比这一小节更干净,更易于阅读。我不确定这是否会改善,但值得指出。
gung-恢复莫妮卡

@Harlan:或者,使点透明,以便多个点堆叠并产生较暗的点?
endolith 2013年

您有原始图片替换此无效链接吗?
endlith 2014年

10

弗兰克·哈雷尔(Frank Harrell)的(最出色的)主题演讲,在useR!上个月显示了这些方法的替代方案:原始数据还显示为点(或点),而不是通过条形图提供的汇总隐藏原始数据。“为什么隐藏数据?” 是弗兰克的评论。

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


1
它可以作为视频吗?听起来不错。
亨里克

1
我认为这个词是“将最终”-记录下来的主题演讲。
Dirk Eddelbuettel

1
我认为这在ggplot中很容易,例如had.co.nz/ggplot2/geom_jitter.html
Mike Dewar

1
jitter还以纯R.

2
仅仅为了协议,弗兰克的演讲(视频)现在在线:r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili 2010年

7

从心理学的角度来看,我主张对数据进行绘图,再加上对数据的不确定性。因此,在如您所​​示的图中,我永远不会费心将条形图一直扩展到零,这只会使眼睛识别数据范围差异的能力最小化。

另外,坦率地说,我是反对路线图的人。条形图将两个变量映射到相同的美学属性(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
)

在此处输入图片说明


1
我应该补充说,我的“仅绘制数据和不确定性”建议应该是合格的:当向具有经验/专业知识并具有要绘制的变量的受众展示数据时,仅绘制数据和不确定性。当向天真的观众展示数据时,当零是一个有意义的数据点时,我将首先展示延伸到零的数据,以便观众可以适应规模,然后放大以仅显示数据和不确定性。
Mike Lawrence 2010年

由于您在编写R代码方面遇到麻烦,可以在最终绘图中包含jpeg图片吗?我发现只需将图像上传到img84.imageshack.us并链接到它就很容易。噢,谢谢你的回答:)
csgillespie 2010年

@csgillespie:完成。
Mike Lawrence 2010年

我发现读取这样的图并geom_ribbon()指出错误会更容易。如果您不喜欢为1到2之间的区域生成明显的估算值,请至少减小误差线的宽度。
2010年

@JoFrwld:我也喜欢色带,尽管我倾向于将它们保留在x轴变量真正为数字的情况下。我在上面的答案中声称违反的“除非x轴变量是数字的,否则不要画线”规则:操作
Mike Lawrence 2010年

2

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

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

对我来说似乎很棒,但是我很想听听反例。我想在该图的使用中隐含的是,数据不具有使均值无效或产生误导的奇怪分布。


我添加了一小部分关于为什么我不喜欢这些情节的内容。
csgillespie 2010年

1
@Chris检验了有关解释重叠CI的信息pubs.amstat.org/doi/abs/10.1198/000313001317097960同样,原始问题还在于围绕SE或SD的互换使用,而它们是两种不同的东西,它们的混淆之处
tosonb1,2010年

或者,要对此站点进行分析,请参阅stats.stackexchange.com/questions/18215。@ tosonb1您的链接超时。您能提供这篇论文的参考吗?
whuber

2

如果数据是比率:即成功次数除以试验次数,那么漏斗图是一种非常优雅的方法。例如,请参阅http://qshc.bmj.com/content/11/4/390.2.full(如果该链接需要订阅,我们表歉意,请告诉我,我会找到另一个)。

可以将其适应其他类型的数据,但是我还没有看到任何示例。

更新:

这是一个不需要订阅的示例的链接(并且很好地解释了如何使用它们):http : //understandinguncertainty.org/fertility

通过简单地将均值与标准误差作图,就可以将它们用于非速率数据,但是它们可能会失去一些简单性。

维基百科的文章并不出色,因为它仅讨论了它们在荟萃分析中的用途。我认为它们在许多其他情况下可能很有用。


数据不是必需的费率。可能是任何东西。
csgillespie 2010年

不幸的是,订阅链接。
马特·帕克

...但是这里是漏斗图上的Wikipedia链接:en.wikipedia.org/wiki/Funnel_plot
Matt Parker 2010年

2

我会在这里使用箱线图;干净,有意义,非参数...或者vioplot(如果分布更有趣)。


2
我不确定像这样小的样本量(n = 6)
箱线

是的,我承认我没有足够仔细地阅读问题,所以这是一个普遍的想法。尽管如此,我认为6分是最低的,但足以用于箱线图。我做了一些实验,它们是有意义的。另一方面,很明显,箱线图不指示观测值的数量(这是此处的重要信息),因此我宁愿使用它与点的组合。

得6分-散点图可能是最好的(也许在平均值上加上一个红点)
Tal Galili 2010年

2
我通常使用带有重叠点的箱形图,我觉得它非常“直观”。我认为小提琴图很难理解。
nico 2010年

1
@csgillespie:什么表明棒状和晶须状更好?它们显示的信息与盒装图基本相同(如您所指出的,晶须可以代表各种事物),它们仅在一个方向上给出错误,这可能会相当令人困惑,如果不是很卑鄙的话……不为盒装图争辩。但是,即使对于相对较小的样本量,beanplots / violinplots仍然应该起作用,因为正如我在这里解释的那样,这只是一个高斯密度估计。
naught101

1

从上面简化@csgillespie的出色代码:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )

0

我更喜欢geom_pointrange而不是errorbar,并认为这些行会分散注意力,而不是有所帮助。这是我发现比@James或@csgillespie版本更干净的版本:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
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.