条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。用来绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差异。
绘制一个简单的条形图与折线图的绘制方法也是大体一致,只需要把拟合方式plt.plot()修改为plt.bar()即可。例如绘制2017年内地电影票房前20的电影和电影票房数据,如何对数据进行可视化分析呢?无疑是进行条形图分析。
老规矩,上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 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() |
结果如下:
程序分析:可以看出,绘制的方法与折线图、散点图大体一致,只是把拟合的方式改成了plt.bar(),其余的大体一致。不过需要注意的是这个散点图需要设置每个条柱的宽度不能超过1,否则会出现混叠!
大家可以发现,这个电影的名字在下方并不好看,对做数据分析的人并不友好,那么就需要将上述的竖条形图转变成横条形图。具体方法很简单,只需要将竖条形图的plt.bar()改为plt.barh()即可。完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 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() |
运行结果如下:
可以看得出,横条形图在这里效果比竖条形图效果好,更容易观测与分析。使用时需要根据实际情况进行斟酌,合理选取。
那么问题又来了,如果我们知道了四部电影:猩球崛起3:终极之战、敦煌尔克、蜘蛛侠:英雄归来、战狼2在三天之内的票房数目,想知道电影本身在这三天自己的票房变化,怎么来绘制条形图呢?
先上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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() |
运行结果如下:
程序分析:可以看出来,上图很好的完成了题目的要求。猩球崛起3:终极之战的三日票房最高,同时三日票房总数呈现上升趋势;敦刻尔克与战狼2的电影票房总体都比较低;蜘蛛侠:英雄归来的票房虽然不多,但有上升趋势,票房数目中等。那么是怎么进行操作的呢?相当于在一幅图中绘制三个直方图,也就是四个电影在三天的票房数目。通过将宽度设置,实现三个直方图的无缝连接,使得形成一部电影在三天的票房数目的对比效果。即第一个条形图开始,第二个条形图起始点加上一个条形图的宽度,第三个条形图加上两个条形图的宽度,然后形成三个直方图的刚好契合。需要注意的是:这个每个直方图的宽度不能超过1/3,也就是三个重叠在一起宽度不能超过1,否则会形成条形图混叠。如下图:
总结:条形图绘制的要点就是使用plt.bar()或者plt.barh(),一定要注意条形图宽度的设置,不能超过1,否则会混叠,影响效果,达不到目标要求。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_52131774/article/details/121450237