使用python绘制横竖条形图


Posted in Python onApril 21, 2022

条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。用来绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差异。

绘制一个简单的条形图与折线图的绘制方法也是大体一致,只需要把拟合方式plt.plot()修改为plt.bar()即可。例如绘制2017年内地电影票房前20的电影和电影票房数据,如何对数据进行可视化分析呢?无疑是进行条形图分析。

老规矩,上代码:

# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
 
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧,爸爸',
'加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章', '乘风破浪',
'神偷奶爸3', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2',
'情圣', '新木乃伊']
 
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
 
# 设置图像大小
plt.figure(figsize=(20, 15), dpi=80)
 
# 绘制条形图
plt.bar(range(len(a)), b, width=1)
 
# 设置字符串到X轴
plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=90)
 
# 显示图形
plt.show()

结果如下:

使用python绘制横竖条形图

程序分析:可以看出,绘制的方法与折线图、散点图大体一致,只是把拟合的方式改成了plt.bar(),其余的大体一致。不过需要注意的是这个散点图需要设置每个条柱的宽度不能超过1,否则会出现混叠!

大家可以发现,这个电影的名字在下方并不好看,对做数据分析的人并不友好,那么就需要将上述的竖条形图转变成横条形图。具体方法很简单,只需要将竖条形图的plt.bar()改为plt.barh()即可。完整代码如下:

# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
 
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧,爸爸',
'加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章', '乘风破浪',
'神偷奶爸3', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2',
'情圣', '新木乃伊']
 
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
 
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
 
# 绘制条形图
plt.barh(range(len(a)), b, height=0.3, color='orange')  # 区别于竖的条形图 不能使用width
 
# 设置字符串到X轴
plt.yticks(range(len(a)), a, fontproperties=my_font)
 
plt.grid(alpha=0.3)
 
# 保存图片
plt.savefig('./movie.png')
 
# 显示图形
plt.show()

运行结果如下:

使用python绘制横竖条形图

可以看得出,横条形图在这里效果比竖条形图效果好,更容易观测与分析。使用时需要根据实际情况进行斟酌,合理选取。

那么问题又来了,如果我们知道了四部电影:猩球崛起3:终极之战、敦煌尔克、蜘蛛侠:英雄归来、战狼2在三天之内的票房数目,想知道电影本身在这三天自己的票房变化,怎么来绘制条形图呢?

先上代码:

from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
 
a = ['猩球崛起3:终极之战', '敦刻尔克', '蜘蛛侠:英雄归来', '战狼2']
b_16 = [15746, 312, 4497, 319]
b_15 = [12357, 156, 2045, 168]
b_14 = [2358, 399, 2358, 362]
 
bar_width = 0.2 # 乘以3小于1
 
# 设置相邻的宽度
x_14 =list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]
 
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
 
# 设置X轴
plt.xticks(x_15,a,fontproperties=my_font)
 
# 绘制图像 设置条形图宽度
plt.bar(range(len(a)), b_14, width=bar_width, label='9月14日')
plt.bar(x_15, b_15, width=bar_width, label='9月15日')
plt.bar(x_16, b_16, width=bar_width, label='9月16日')
 
# 设置图例
plt.legend(prop=my_font)
 
# 显示图像
plt.show()

运行结果如下:

使用python绘制横竖条形图

程序分析:可以看出来,上图很好的完成了题目的要求。猩球崛起3:终极之战的三日票房最高,同时三日票房总数呈现上升趋势;敦刻尔克与战狼2的电影票房总体都比较低;蜘蛛侠:英雄归来的票房虽然不多,但有上升趋势,票房数目中等。那么是怎么进行操作的呢?相当于在一幅图中绘制三个直方图,也就是四个电影在三天的票房数目。通过将宽度设置,实现三个直方图的无缝连接,使得形成一部电影在三天的票房数目的对比效果。即第一个条形图开始,第二个条形图起始点加上一个条形图的宽度,第三个条形图加上两个条形图的宽度,然后形成三个直方图的刚好契合。需要注意的是:这个每个直方图的宽度不能超过1/3,也就是三个重叠在一起宽度不能超过1,否则会形成条形图混叠。如下图:

使用python绘制横竖条形图

总结:条形图绘制的要点就是使用plt.bar()或者plt.barh(),一定要注意条形图宽度的设置,不能超过1,否则会混叠,影响效果,达不到目标要求。


Tags in this post...

Python 相关文章推荐
python实现得到一个给定类的虚函数
Sep 28 Python
在Python中使用列表生成式的教程
Apr 27 Python
Python发送http请求解析返回json的实例
Mar 26 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
python画条形图的具体代码
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 #Python
Pandas 数据编码的十种方法
Apr 20 #Python
Python读取和写入Excel数据
Python 的演示平台支持 WSGI 接口的应用
Apr 20 #Python
You might like
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
jquery滚动加载数据的方法
2015/03/09 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
10条PHP编程习惯
2014/05/26 面试题
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
家长会后的感想
2015/08/11 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL