使用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 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python递归遍历列表及输出的实现方法
May 19 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
Python self用法详解
Nov 28 Python
python 经纬度求两点距离、三点面积操作
Jun 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
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
js 窗口抖动示例
2013/09/04 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
物业总经理岗位职责
2014/02/28 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
付款承诺函范文
2015/01/21 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
oracle索引总结
2021/09/25 Oracle
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS