如何使用python绘制带错误条的条形图?

时间:2016-11-13 16:44:47

标签: python python-3.x matplotlib plot

我使用的是Python 3.5。此外,我是初学者(3周经验)Python尝试者,不知怎的,我没有放弃尝试分析我的数据。

数据说明:我的数据位于csv文件(fev.csv)中。如果你想看到full data set的全部范围,我已将它包含在此处。它有5列:

  • 年龄(岁)
  • fev(升)
  • ht(inches)
  • 性别(女性= 0,男性= 1)
  • 吸烟(非吸烟者= 1,吸烟者= 1)

任务:我正在尝试编写程序来生成平均FEV的条形图,其中误差条表示标准偏差。我想尝试在4个不同年龄段(11-12岁,13-14岁,15-16岁,17岁或以上)的2个并排酒吧(吸烟者/不吸烟者)。

到目前为止的代码(请原谅我所有的#notes,这有助于我了解我正在尝试做什么):

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd



data = pd.read_csv('fev.csv')



nonsmokers = data[data.smoke==0]

smokers = data[data.smoke==1]



nonsmokers1 = nonsmokers[(nonsmokers.age==11) | (nonsmokers.age==12)]

nonsmokers2 = nonsmokers[(nonsmokers.age==13) | (nonsmokers.age==14)]

nonsmokers3 = nonsmokers[(nonsmokers.age==15) | (nonsmokers.age==16)]

nonsmokers4 = nonsmokers[(nonsmokers.age>=17)]



smokers1 = smokers[(smokers.age==11) | (smokers.age==12)]

smokers2 = smokers[(smokers.age==13) | (smokers.age==14)]

smokers3 = smokers[(smokers.age==15) | (smokers.age==16)]

smokers4 = smokers[(smokers.age>=17)]



nonsmMean = [nonsmokers1.fev.mean(), nonsmokers2.fev.mean(), nonsmokers3.fev.mean(), nonsmokers4.fev.mean()]

nonsmSd = [nonsmokers1.fev.std(), nonsmokers2.fev.std(), nonsmokers3.fev.std(), nonsmokers4.fev.std()]

smMean = [smokers1.fev.mean(), smokers2.fev.mean(), smokers3.fev.mean(), smokers4.fev.mean()]

smSd = [smokers1.fev.std(), smokers2.fev.std(), smokers3.fev.std(), smokers4.fev.std()]



# data to be plotted

nonsmoker = np.array(nonsmMean)

sdNonsmoker = np.array(nonsmSd)

smoker = np.array(smMean)

sdSmoker = np.array(smSd)



# parameters

bar_width = 0.35

x = np.arange(len(nonsmoker))



# plotting bars

plt.bar(x, nonsmoker, bar_width, yerr=sdNonsmoker, ecolor='k', color='b', label='Nonsmokers')

plt.bar(x+bar_width, smoker, bar_width, yerr=sdSmoker, ecolor='k', color='m', label='Smokers')



# formatting and labeling the axes and title

plt.xlabel('Age')

plt.ylabel('FEV')

plt.title('Mean FEV by Age and Smoking Status')



plt.xticks(x+0.35, ['11 to 12', '13 to 14', '15 to 16', '17+'])



# adding the legend

plt.legend()



plt.axis([-0.5,4.2,0,7])



plt.savefig('FEVgraph.png', dpi=300)


# and we are done!

plt.show() 

有更有效的方法吗?

谢谢!

0 个答案:

没有答案