条形图
条形图介绍
条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图。
特点
• 能够使人们一眼看出各个数据的大小。
• 易于比较数据之间的差别。
条形图绘制
条形图通过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()