Matplotlib绘制条形图

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轴的刻度,对数值标注位置进行合适的设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜的乄第七章

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值