在python中有多种方法绘制柱状图,可使用matplotlib库、numpy库、pandas库、seaborn库等。通过做题,更快理解如何使用不同第三方库组合绘制柱状图。
在matplotlib库中,绘制柱状图,一般用plt.bar()函数。
1. 垂直柱状图
import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"]#设置字体plt.rcParams["axes.unicode_minus"] = Falsex = [1,2,3,4,5,6,7,8] #X轴数据y = [30,11,42,53,81,98,72,25]#Y轴数据对应柱子高度#定义柱子子的标签labels = ["A","B","C","D","E","F","G","H"] #绘制纵向柱状图plt.bar(x,y,align = "center", color=["r","g","b"], tick_label = labels, hatch = "/", ec = 'gray')#hatch定义柱图的斜纹填充,省略该参数表示默认不填充; ec边框颜色为灰色。#绘制X、Y轴标签plt.xlabel(u"样品编号") #u代表对字符串进行unicode编码。对中文表明所需编码,防止出现乱码。plt.ylabel(u"库存数量")#绘制柱状图标题plt.title("带颜色的柱状图")plt.show()
(垂直柱状图)运行结果如下:
2. 水平柱状图
将垂直柱状图的X、Y轴的标签交换就可以得到水平的柱状图
import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"]#设置字体plt.rcParams["axes.unicode_minus"] = Falseplt.barh(x,y,align = "center", color=["r","g","b","c","magenta"], tick_label = labels, hatch = "/", ec = 'gray')# 水平柱状图和垂直柱状图的X,Y轴标签交换plt.ylabel(u"游戏种类") #u代表对字符串进行unicode编码。对中文表明所需编码,防止出现乱码。plt.xlabel(u"销售(个)")plt.title("游戏销量对比")plt.show()
(水平柱状图)运行结果如下:
3. 简单的堆叠直方图(应用题)
假设有男生女生都有四个爱好,分别是足球、游泳、看剧、逛街,用直方图体现出各个爱好的男女比例。
import matplotlib.pyplot as pltimport numpy as np#设置中文字体、大小plt.rc('font',family='SimHei',size=15)#绘制柱状图标题plt.title('男女爱好人数分布图')#归纳数据num=np.array([14325,9403,13227,18651]) #每一项爱好的总人数ratio=np.array([0.75,0.6,0.22,0.1])#男性占比men=num*ratio#男性在每一项爱好的人数women=num*(1-ratio)#女性在每一项爱好的人数#定义X轴标签x=['足球','游泳','看剧','逛街'] width=0.5#柱宽idx=np.arange(len(x)) #索引#绘制直方图plt.bar(idx,men,width,color='red',label='男性用户') #在索引到对应的刻度,柱宽为0.5,红色部分代表男性用户plt.bar(idx,women,width,bottom=men,color='gray',label='女性用户') #在索引到对应的刻度,柱宽为0.5,底部和男性用户一样,灰色部分代表女性用户#绘制X、Y轴标签plt.xlabel('应用比例') plt.ylabel('男女分布')#定义X轴标签刻度位置,字体旋转40° plt.xticks(idx+width/2,x,rotation=40) #使直方图上显示数字for a,b in zip(idx,men):plt.text(a,b+0.05,'%.0f'%b,ha='center',va='bottom',fontsize=12)for a,b,c in zip(idx,women,men):plt.text(a,b+c+0.05,'%.0f'%b,ha='center',va='bottom',fontsize=12)plt.legend()#显示图例plt.show() #显示柱状图
(堆叠直方图)运行结果如下:
4. 并列柱状图
import matplotlib.pyplot as pltimport numpy as np#定义中文字体类型plt.rcParams['font.sans-serif']=['SimHei'] #定义柱状图标题plt.title('育才小学五年级各班成绩优秀人数统计图') chinese=[10.0, 5.0, 6.0, 9.0, 15.0, 17.0, 8.0, 11.0] #各班语文成绩优秀人数english=[7.0, 13.0, 15.0, 12.0, 8.0, 12.0, 16.0, 13.0]#各班英语成绩优秀人数math=[5.0, 10.0, 8.0, 5.0, 10.0, 9.0, 13.0, 7.0] #各班数学成绩优秀人数bar_width=0.2#定义柱宽为0.2tick_label=['1班','2班','3班','4班','5班','6班','7班','8班'] #定义X轴标签名称x=np.arange(len(tick_label))#X轴标签分布有8个#绘制并列柱状图plt.bar(x,chinese,bar_width,color='r',align='center',label='语文') #柱宽为0.2,标签在柱子中间,红色柱子代表语文成绩plt.bar(x+bar_width,math,bar_width,color='y',align='center',label='数学')#柱宽为0.2,标签在柱子中间,黄色柱子代表数学成绩plt.bar(x+bar_width*2,english,bar_width,color='c',align='center',label='英语')#柱宽为0.2,标签在柱子中间,青色柱子代表英语成绩plt.xlabel('班级') #定义X轴标签plt.ylabel('成绩') #定义Y轴标签plt.xticks(x+bar_width,tick_label)#定义X轴标签位置plt.legend() #显示图例plt.show() #显示柱状图
(并列柱状图)运行结果如下:
如有错误,欢迎各位大神指正。