Python3——matplotlib条形图的绘制
实验环境
python 3.6
matplotlib 2.2.3
条形图的绘制
matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)
1. left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串
2. height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
3. alpha:透明度,值越小越透明
4. width:为柱形图的宽度,一般这是为0.8即可;
5. color或facecolor:柱形图填充的颜色;
6. edgecolor:图形边缘颜色
7. label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签
简单垂直条形图
- 直辖市GDP水平
中国的四个直辖市分别为北京市、上海市、天津市和重庆市,其2017年上半年的GDP分别为12406.8亿、13908.57亿、9386.87亿、9143.64亿。对于这样一组数据,我们该如何使用条形图来展示各自的GDP水平呢?
# 导入模块
import matplotlib.pyplot as plt
# 构建数据
GDP = [12406.8,13908.57,9386.87,9143.64]
# 中文乱码处理
plt.rcParams["font.sans-serif"] = ["KaiTi"]
plt.rcParams['axes.unicode_minus'] = False
# 绘图
plt.bar(range(4),GDP,align = "center",color = "steelblue",alpha = 0.6)
# 添加y轴标签
plt.ylabel("GDP")
# 设置Y轴的刻度范围
plt.ylim([5000,15000])
# 添加x轴刻度标签
plt.xticks(range(4),['北京市','上海市','天津市','重庆市'])
# 添加标题
plt.title('四个直辖市GDP大比拼')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP):
plt.text(x,y+300,'%s' %round(y,1),ha='center')# y+300 标签的坐标
# 显示图形
plt.show()
简单水平条形图
- 同一本书不同平台最低价比较
很多人在买一本书的时候,都比较喜欢货比三家,例如《python数据分析实战》在亚马逊、当当网、中国图书网、京东和天猫的最低价格分别为39.5、39.9、45.4、38.9、33.34。针对这个数据,我们也可以通过条形图来完成,这里使用水平条形图来显示:
# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
price = [39.5,39.9,45.4,38.9,33.34]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =["KaiTi"]
plt.rcParams['axes.unicode_minus'] = False
# 绘图
plt.barh(range(5), price, align = 'center',color='steelblue', alpha = 0.8)
# 添加轴标签
plt.xlabel('价格')
# 添加标题
plt.title('不同平台书的最低价比较')
# 添加刻度标签
plt.yticks(range(5),['亚马逊','当当网','中国图书网','京东','天猫'])
# 设置Y轴的刻度范围
plt.xlim([32,47])
# 为每个条形图添加数值标签
for x,y in enumerate(price):
plt.text(y+0.1,x,'%s' %y,va='center')
# 显示图形
plt.show()
水平交错条形图
- 胡润财富榜:亿万资产超高净值家庭数
利用水平交错条形图对比2016年和2017年亿万资产超高净值家庭数(top5)
# 导入绘图模块
import matplotlib.pyplot as plt
import numpy as np
# 构建数据
Y2016 = [15600,12700,11300,4270,3620]
Y2017 = [17400,14800,12000,5200,4020]
labels = ['北京','上海','香港','深圳','广州']
bar_width = 0.35
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =["KaiTi"]
plt.rcParams['axes.unicode_minus'] = False
# 绘图
plt.bar(np.arange(5), Y2016, label = '2016', color = 'steelblue', alpha = 0.8, width = bar_width)
plt.bar(np.arange(5)+bar_width, Y2017, label = '2017', color = 'indianred', alpha = 0.8, width = bar_width)
# 添加轴标签
plt.xlabel('Top5城市')
plt.ylabel('家庭数量')
# 添加标题
plt.title('亿万财富家庭数Top5城市分布')
# 添加刻度标签
plt.xticks(np.arange(5)+bar_width,labels)
# 设置Y轴的刻度范围
plt.ylim([2500, 19000])
# 为每个条形图添加数值标签
for x2016,y2016 in enumerate(Y2016):
plt.text(x2016-0.2, y2016+100, '%s' %y2016)
for x2017,y2017 in enumerate(Y2017):
plt.text(x2017+bar_width-0.2, y2017+100, '%s' %y2017)
# 显示图例
plt.legend()
# 显示图形
plt.show()