在python中有多种方法绘制柱状图,可使用matplotlib库、numpy库、pandas库、seaborn库等。通过做题,更快理解如何使用不同第三方库组合绘制柱状图。
在matplotlib库中,绘制柱状图,一般用plt.bar()函数。
1. 垂直柱状图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"] = False
x = [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 plt
plt.rcParams["font.sans-serif"] = ["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"] = False
plt.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("2021年游戏销量对比")
plt.show()
(水平柱状图)运行结果如下:
3. 简单的堆叠直方图(应用题)
假设有男生女生都有四个爱好,分别是足球、游泳、看剧、逛街,用直方图体现出各个爱好的男女比例。
import matplotlib.pyplot as plt
import 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 plt
import 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.2
tick_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() #显示柱状图
(并列柱状图)运行结果如下:
如有错误,欢迎各位大神指正。