Python数据分析课--第五节 Matplotlib---条形图

条形图

条形图介绍

条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图。

特点

• 能够使人们一眼看出各个数据的大小。
• 易于比较数据之间的差别。
在这里插入图片描述
在这里插入图片描述

条形图绘制

条形图通过bar()函数绘制

• plt.bar(x, height) # 绘制以x为x轴位置,height为y轴位置的竖条形图
水平条形图绘制

水平条形图通过barh()函数绘制

• plt.barh(y, width) # 绘制以y为y轴位置,width为y轴位置的水平条形图

练习1

假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据
a = [“流浪地球”,“复仇者联盟4:终局之战”,“哪吒之魔童降世”,“疯狂的外星人”,“飞驰人生”,“蜘蛛侠:英雄远征”,“扫毒2天地对决”,“烈火英雄”,“大黄蜂”,“惊奇队长”,“比悲伤更悲伤的故事”,“哥斯拉2:怪兽之王”,“阿丽塔:战斗天使”,“银河补习班”,“狮子王”,“反贪风暴4”,“熊出没”,“大侦探皮卡丘”,“新喜剧之王”,“使徒行者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,5.22] 单位:亿


from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\STXINGKA.TTF", size=14) # 找到自带的字体格式

# 构建x,height
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者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,5.22]

# 放大画布
plt.figure(figsize=(14,8))

# 柱状图
# width 调整柱子的宽度 默认0.8
# bottom y起始值改变了 用在堆叠图
# align 默认是center,边缘是edge,要是想左边,需要将width=-0.3,右边width=0.3
plt.bar(a,b,width=-0.3,bottom=10,align="edge")

# 设置刻度
plt.xticks(range(len(a)),a,fontproperties=font,rotation=90)

plt.show()

在这里插入图片描述

练习2

在这里插入图片描述

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sale = [1000,800,3000]
Q2_sale = [1200,700,2800]

# 柱子的对应索引位置 [0,1,2]
# 设置柱子的宽度
width = 0.35
# rects1 = plt.bar(list(range(len(fruits))),Q1_sale,width)
# rects2 = plt.bar(list(range(len(fruits))),Q2_sale,width)
# 两个柱形宽度都为0.35 怎么使分别显示左右
# 位置左移width/2 位置是-width/2  [0-width/2,1-width/2,2-width/2]
po_l = [i-width/2 for i in list(range(len(fruits)))]
plt.bar(po_l,Q1_sale,width,label="Q1")

po_r = [i+width/2 for i in list(range(len(fruits)))]
plt.bar(po_r,Q2_sale,width,label="Q2")

# 设置图例
plt.legend()

# 设置刻度
plt.xticks(range(len(fruits)),fruits)

# 因此考虑函数封装 自动添加标签
def auto_label(x_po,y_po):  #  添加形参
    for x_i, y_i in zip(x_po,y_po):  # 传入x_po,y_po
        plt.annotate(f"{y_i}", xy=(x_i,y_i), xytext=(x_i-0.05,y_i+10),color="blue")

# 调用
auto_label(po_l,Q1_sale)
auto_label(po_r,Q2_sale)

plt.show()

在这里插入图片描述

堆叠图也没有封装响应的接口

# 堆叠图也没有封装响应的接口
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sale = [1000,800,3000]
Q2_sale = [1700,200,2800]

plt.bar(range(len(fruits)),Q1_sale,width=0.5,label="Q1")  # 注意x轴不能简单的用fruits,而是用range(len(fruits)),这样才能不自动排列
plt.bar(range(len(fruits)),Q2_sale,width=0.5,bottom=Q1_sale,label="Q2")

# 设置图例
plt.legend()

# 设置刻度
plt.xticks(range(len(fruits)),fruits)
plt.show()

在这里插入图片描述

水平条形图

# 水平条形图

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)


# 构建y,width
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者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,5.22]

plt.barh(range(len(a)),b,height=0.5)

# 设置刻度
plt.yticks(range(len(a)),a)

plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值