指示条形图中的统计上显着的差异

时间:2012-07-17 07:38:25

标签: python matplotlib figure

我使用条形图来指示每个组的数据。这些条中的一些彼此显着不同。如何指出条形图中的显着差异?

import numpy as np
import matplotlib.pyplot as plt
menMeans   = (5, 15, 30, 40)
menStd     = (2, 3, 4, 5)
ind = np.arange(4)    # the x locations for the groups
width=0.35
p1 = plt.bar(ind, menMeans, width=width, color='r', yerr=menStd)
plt.xticks(ind+width/2., ('A', 'B', 'C', 'D') )

我的目标是

enter image description here

2 个答案:

答案 0 :(得分:17)

我在这里做了一些事情,我建议在使用复杂的情节时。将自定义格式拉出到字典中,当您想要更改参数时,它可以简化生活 - 您可以将此字典传递给多个图。我还为annotate itervalues编写了一个自定义函数,作为奖励它可以在(A,C)之间进行注释,如果你真的想要(我支持我的评论,这不是正确的视觉方法,但是)。一旦数据发生变化,可能需要进行一些调整,但这应该会让你走上正轨。

import numpy as np
import matplotlib.pyplot as plt
menMeans   = (5, 15, 30, 40)
menStd     = (2, 3, 4, 5)
ind  = np.arange(4)    # the x locations for the groups
width= 0.7
labels = ('A', 'B', 'C', 'D')

# Pull the formatting out here
bar_kwargs = {'width':width,'color':'y','linewidth':2,'zorder':5}
err_kwargs = {'zorder':0,'fmt':None,'linewidth':2,'ecolor':'k'}  #for matplotlib >= v1.4 use 'fmt':'none' instead

fig, ax = plt.subplots()
ax.p1 = plt.bar(ind, menMeans, **bar_kwargs)
ax.errs = plt.errorbar(ind, menMeans, yerr=menStd, **err_kwargs)


# Custom function to draw the diff bars

def label_diff(i,j,text,X,Y):
    x = (X[i]+X[j])/2
    y = 1.1*max(Y[i], Y[j])
    dx = abs(X[i]-X[j])

    props = {'connectionstyle':'bar','arrowstyle':'-',\
                 'shrinkA':20,'shrinkB':20,'linewidth':2}
    ax.annotate(text, xy=(X[i],y+7), zorder=10)
    ax.annotate('', xy=(X[i],y), xytext=(X[j],y), arrowprops=props)

# Call the function
label_diff(0,1,'p=0.0370',ind,menMeans)
label_diff(1,2,'p<0.0001',ind,menMeans)
label_diff(2,3,'p=0.0025',ind,menMeans)


plt.ylim(ymax=60)
plt.xticks(ind, labels, color='k')
plt.show()

enter image description here

答案 1 :(得分:0)

如果您正在使用 matplotlib 并寻求 boxplot 注释,请将我的代码用作函数:

统计标注

def AnnoMe(x1, x2, ARRAY, TXT):
    y, h, col = max(max(ARRAY[x1-1]),max(ARRAY[x2-1])) + 2, 2, 'k'
    plt.plot([x1, x1, x2, x2], [y, y+h, y+h, y], lw=1.5, c=col)
    plt.text((x1+x2)*.5, y+h, TXT, ha='center', va='bottom', color=col)

其中“x1”和“x2”是要比较的两列,“ARRAY”是用于说明箱线图的列表列表。并且,“TXT”是您的文本,如 p 值或字符串格式中的重要/不重要。

相应地,调用它:

AnnoMe(1, 2, MyArray, "p-value=0.02")