Matplotlib绘制条形图
利用Jupter Notebook 绘制柱形图,主要介绍如何使用matplotlib库中的各种方法绘制柱形图,以及对图形的修饰。
案例以电影的票房数为载体
案例一:电影票房数
# 导入库
import matplotlib.pyplot as plt
# 设置字体,雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 准备数据(过长的电影名称进行了换行处理)
a=["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5\n∶ 最后的骑士","摔跤吧! 爸爸","加勒比海盗5\n∶ 死无对证",
"金刚\n∶ 骷髅岛","极限特工\n∶终极回归","生化危机6\n∶终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺",
"金刚狼3\n∶殊死一战","蜘蛛侠\n∶英雄归来","悟空传","银河护卫队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.bar(range(len(a)),b)
# 调整刻度
plt.xticks(range(len(a)),a,rotation=45) # 电影名称过长,旋转45度
plt.yticks(range(60)[::5]) # 设置y周刻度到60 步长为5
# 添加描述信息
plt.xlabel('电影名称')
plt.ylabel('票房数 单位:亿元')
# 添加数值标签
for x,y in enumerate(b):
plt.text(x,y+1,'%s' %round(y,1),ha='center')
# 添加标题
plt.title('电影票房数')
plt.show()
案例二:电影票房数(横向条形图)
# 导入库
import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 准备数据
a=["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5\n∶ 最后的骑士","摔跤吧! 爸爸","加勒比海盗5\n∶ 死无对证",
"金刚\n∶ 骷髅岛","极限特工\n∶终极回归","生化危机6\n∶终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺",
"金刚狼3\n∶殊死一战","蜘蛛侠\n∶英雄归来","悟空传","银河护卫队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.barh(range(len(a)),b,height=0.5)
plt.yticks(range(len(a)),a)
plt.xticks(range(60)[::5]) # 设置x轴的步长为5
# 添加描述信息
plt.xlabel('票房数 单位:亿元')
plt.ylabel('电影名称')
# 添加标题
plt.title('电影票房条形图')
# 添加数值标签
for x,y in enumerate(b):
plt.text(y+0.5,x,'%s' %round(y,1),va='center')
#添加网格线
plt.grid(alpha=0.3)
plt.show()
案例三:电影前三天票房数(簇状条形图)
# 导入库
import matplotlib.pyplot as plt
# 设置字体为雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 准备数据
a = ['猩球崛起3:终极之战','敦刻尔克','蜘蛛侠:英雄归来','战狼2']
y_16 = [15746,312,4497,319]
y_15 = [12357,156,2045,168]
y_14 = [2358,399,2358,362]
# 设置条形的宽度
bar_width = 0.2
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.bar(range(len(a)),y_14,width=bar_width,label='14日')
plt.bar(x_15,y_15,width=bar_width,label='15日')
plt.bar(x_16,y_16,width=bar_width,label='16日')
# 设置x轴的刻度
plt.xticks(x_15,a)
# 添加描述信息
plt.xlabel('电影名称')
plt.ylabel('电影票房 单位:万元')
# 添加名称
plt.title('14-16日三天的票房数')
# 添加图例
plt.legend(loc='best')
# 为每个条形图添加数值标签
for x,y in enumerate(y_14):
plt.text(x, y+100, '%s' %y,ha='center')
for x,y in enumerate(y_15):
plt.text(x+bar_width, y+100, '%s' %y,ha='center')
for x,y in enumerate(y_16):
plt.text(x+bar_width*2, y+100, '%s' %y,ha='center')
plt.show()
案例四:首日首周票房对比(簇状条形图)
# 导入库
import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 准备数据()
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587,10062,1275.7]
first_week = [36224,34479,11830]
# 绘制条形图
x = range(len(movie_name))
plt.bar(x,first_day,width=0.2,label='首日票房')
plt.bar([i+0.2 for i in x],first_week,width=0.2,label='首周票房')
# 修改刻度
plt.xticks([i+0.1 for i in x],movie_name)
# 增加标签
plt.xlabel('电影名称')
plt.ylabel('票房数量 单位:万元')
# 增加标题
plt.title('首日及首周票房比较')
# 增加图例
plt.legend(loc='best')
# 添加数值标签
for x,y in enumerate(first_day):
plt.text(x,y+500,'%s'%y,ha='center')
for x,y in enumerate(first_week):
plt.text(x+0.2,y+500,'%s'%y,ha='center')
plt.show()
总结:
绘制条形图的难点在于数值标签的添加,需要用到for循环和enumerate函数来添加数值。其次,通过y轴的刻度,对数值标注位置进行合适的设置。