数据可视化:绘制图表(一)——柱状图

在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()                             #显示柱状图

(并列柱状图)运行结果如下:

如有错误,欢迎各位大神指正。

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值