使用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的另外几种语言实现
Jan 29 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
K-近邻算法的python实现代码分享
Dec 09 Python
Python内存管理实例分析
Jul 10 Python
python3实现mysql导出excel的方法
Jul 31 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
python Scrapy框架原理解析
Jan 04 Python
python实现图片转字符画的完整代码
Feb 21 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
python中的3种定义类方法
Nov 27 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 字符串操作入门教程
2006/12/06 PHP
简单的PHP图片上传程序
2008/03/27 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
简单介绍Python中的JSON使用
2015/04/28 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
python字典一键多值实例代码分享
2019/06/14 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
日语专业毕业生自荐书
2014/06/18 职场文书
甘南现象心得体会
2014/09/11 职场文书
计划生育责任书
2015/05/09 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
vscode中使用npm安装babel的方法
2021/08/02 Javascript