我在matplotlib(python)中有一个带有误差条的条形图,但我想要在条形图中间的误差条。我该怎么做呢?谢谢

时间:2015-02-08 12:54:04

标签: python matplotlib bar-chart

#Figure 1, right at the bottom of the code, needs the error bars.

import scipy as sp

import numpy as np

import pylab as pl

import matplotlib as mpl

import numpy.random as nr

import matplotlib.pyplot as plt

M = 91.0

G = 2.5

RS = 0.14

JS = -0.033

S = np.arange(20,140,0.1)

def sigs(com):

    for i in com:

        yield  ((4.0*np.pi)/3.0)*((1/i**2) + (((i**2)*RS + JS*((i**2)-M**2))/(((i**2)-M**2)**2 + (M*G)**2)))


x = list(sigs(S))


RA = 0.0027

JA = 0.81

def siga(com):

    for i in com:

        yield np.pi*((i**2)*RA + JA*((i**2) - M**2))/((((i**2) - M**2)**2) + (M*G)**2) 


a = list(siga(S))


N = []

for m in x:

    N.append(1000000*8*m/3)


cos = np.arange(-0.95, 0.90, 0.05)

sin = np.arange(-0.90, 0.95, 0.05) 

M = []

for (i, j) in zip(cos,sin):

    M.append((1000000*j*(0.094 + 0.0313*j*j + 0.000679*j))-(1000000*i*(0.094 + 0.0313*i*i + 0.000679*i)))


s = np.random.poisson(M)

z = []

for t in s:

    z.append(t**0.5)

plt.figure(4)

pl.bar(cos, s, width = 0.05)

pl.xlabel('cos${\Theta}$')

pl.ylabel('Number of muons produced within the cos${\Theta}$ interval')
yerr = z

plt.errorbar(cos, s, yerr=yerr, fmt = 'o')

pl.show()

2 个答案:

答案 0 :(得分:4)

请注意bar() also accepts a yerr= argument

pl.bar(cos, s, width=0.05, yerr=yerr)

这会自动将误差条放在每个条的中心。首先不需要绘制条形图,然后使用errorbar()在顶部绘制误差条。

答案 1 :(得分:0)

问题是您使用相同的x数据(在您的情况下为cos)作为误差线和条形图。一个简单的解决方案是为误差条的x数据添加1/2 bar宽度,换句话说:

plt.errorbar(cos + 0.025 , s, yerr=yerr, fmt = 'o')

其中0.025是条宽的一半。