簡體   English   中英

如何使用Python的Matplotlib在條形圖上添加顯着性水平?

[英]How to add significance levels on bar graph using Python's Matplotlib?

我已經編寫了一些代碼來繪制Python Matplotlib中的一些數據。

該劇情目前: 我的情節目前的樣子

生成該圖的代碼:

groups=['Control','30min','24hour']
cell_lysate_avg=[11887.42595,   4862.429689,    3414.337554]
cell_lysate_sd=[1956.212855,    494.8437915,    525.8556207]
cell_lysate_avg=[i/1000 for i in cell_lysate_avg]
cell_lysate_sd=[i/1000 for i in cell_lysate_sd]


media_avg=[14763.71106,8597.475539,6374.732852]
media_sd=[240.8983759,  167.005365, 256.1374017]
media_avg=[i/1000 for i in media_avg] #to get ng/ml
media_sd=[i/1000 for i in media_sd]

fig, ax = plt.subplots()
index = numpy.arange(len(groups)) #where to put the bars
bar_width=0.45
opacity = 0.5
error_config = {'ecolor': '0.3'}

cell_lysate_plt=plt.bar(index,cell_lysate_avg,bar_width,alpha=opacity,color='black',yerr=cell_lysate_sd,error_kw=error_config,label='Cell Lysates')
media_plt=plt.bar(index+bar_width,media_avg,bar_width,alpha=opacity,color='green',yerr=media_sd,error_kw=error_config,label='Media')
plt.xlabel('Groups',fontsize=15)
plt.ylabel('ng/ml',fontsize=15)
plt.title('\n'.join(wrap('Average Over Biological Repeats for TIMP1 ELISA (n=3)',45)),fontsize=15)
plt.xticks(index + bar_width, groups)
plt.legend()
ax.tick_params(axis='x', labelsize=14)
ax.tick_params(axis='y', labelsize=14)

我已經計算了與此數據相關的各種兩個拖尾t檢驗,並且我想使用標准的科學期刊表示法進行顯示-即一條連接兩個條形圖和一個星形的線,該星形表示的顯着性水平為(例如)> 0.05。 有人可以告訴我該怎么做嗎?

據我所知,尚無標准的科學期刊可以顯示其重要性。 繪制它的確切方式取決於品味。 這可能是為什么matplotlib對顯着性條沒有特定功能的原因(至少據我所知)。 您可以手動完成。 例如:

from matplotlib.markers import TICKDOWN

def significance_bar(start,end,height,displaystring,linewidth = 1.2,markersize = 8,boxpad  =0.3,fontsize = 15,color = 'k'):
    # draw a line with downticks at the ends
    plt.plot([start,end],[height]*2,'-',color = color,lw=linewidth,marker = TICKDOWN,markeredgewidth=linewidth,markersize = markersize)
    # draw the text with a bounding box covering up the line
    plt.text(0.5*(start+end),height,displaystring,ha = 'center',va='center',bbox=dict(facecolor='1.', edgecolor='none',boxstyle='Square,pad='+str(boxpad)),size = fontsize)

pvals = [0.001,0.1,0.00001]
offset  =1
for i,p in enumerate(pvals):
    if p>=0.05:
        displaystring = r'n.s.'
    elif p<0.0001:
        displaystring = r'***'
    elif p<0.001:
        displaystring = r'**'
    else:
        displaystring = r'*'

    height = offset +  max(cell_lysate_avg[i],media_avg[i])
    bar_centers = index[i] + numpy.array([0.5,1.5])*bar_width
    significance_bar(bar_centers[0],bar_centers[1],height,displaystring)

當然,除了星星,您還可以顯式編寫p<0.05或類似值。 然后,您可以花費數小時來擺弄參數,直到看起來正確為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM