一、绘制散点图
1、实例一
需求:
- 王女士和张女士约定好一起减肥,并每个礼拜一记录体重和腰围。
- 请用图像展现王女士和张女士内腰围和体重的变化情况。
# 思路:展现腰围和体重的变化规律情况,选择散点图;画图三步曲:创建画布、绘制图像、展示图像
import numpy as np
import matplotlib.pyplot as plt
# 1. 创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2. 根据需求绘制图像
x_wang_weight = [47.2, 46.6, 46.6, 46.2, 46.7, 46.5, 46.5, 46.3, 46.6, 46.3, 46.4]
y_wang_waist = [79.6, 78.6, 78.0, 77.5, 78.0, 78.0, 78.0, 78.0, 78.0, 78.6, 79.0]
x_zhang_weight = [51.5, 50.8, 51.2, 51.6, 50.9, 50.4, 50.5, 51.5, 51.8, 52.9]
y_zhang_waist = [73.0, 73.0, 75.0, 75.6, 74.0, 72.0, 73.0, 73.0, 74.0, 73.0]
plt.scatter(x_wang_weight, y_wang_waist)
plt.scatter(x_zhang_weight, y_zhang_waist)
# ① 修改x和y轴显示
x_label = ["{:.1f}kg".format(i) for i in np.arange(45, 55, 0.5)]
plt.xticks(np.arange(45, 55, 0.5), x_label, fontsize=13)
y_label = ["{:.1f}cm".format(i) for i in np.arange(70, 80, 0.5)]
plt.yticks(np.arange(70, 80, 0.5), y_label, fontsize=13)
# ② 增加描述信息
plt.xlabel("体重/KG", fontsize=16)
plt.ylabel("腰围/CM", fontsize=16)
plt.title("王女士&张女士体重和腰围的变化情况", fontsize=16)
# 3. 展现图像
plt.show()
2、完善实例一
- 对比显示王女士和张女士的体重、腰围随着时间变化情况
import numpy as np
import matplotlib.pyplot as plt
# 1. 创建画布
#plt.figure(figsize=(20, 8), dpi=80)
figrue,axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=60)
# 2. 根据需求绘制图像
x = ["第{}周".format(i) for i in range(1, 12)]
y_wang_waist = [79.6, 78.6, 78.0, 77.5, 78.0, 78.0, 78.0, 78.0, 78.0, 78.6, 79.0]
y_wang_weight = [47.2, 46.6, 46.6, 46.2, 46.7, 46.5, 46.5, 46.3, 46.6, 46.3, 46.4]
y_zhang_waist = [73.0, 73.0, 75.0, 75.6, 74.0, 72.0, 73.0, 73.0, 74.0, 73.0, 73.3]
y_zhang_weight = [51.5, 50.8, 51.2, 51.6, 50.9, 50.4, 50.5, 51.5, 51.8, 52.9, 53.0]
axes[0].plot(x, y_wang_weight, label="王小姐")
axes[0].plot(x, y_zhang_weight, label="张小姐")
axes[1].plot(x, y_wang_waist, label="王小姐")
axes[1].plot(x, y_zhang_waist, label="张小姐")
axes[0].scatter(x, y_wang_weight)
axes[0].scatter(x, y_zhang_weight)
axes[1].scatter(x, y_wang_waist)
axes[1].scatter(x, y_zhang_waist)
# ① 修改y轴分别显示体重和腰围
weight_label = ["{:.1f}kg".format(i) for i in np.arange(45, 60)]
axes[0].set_yticks(np.arange(45, 60))
axes[0].set_yticklabels(weight_label)
waist_label = ["{:.1f}cm".format(i) for i in np.arange(70, 80)]
axes[1].set_yticks(np.arange(70, 80))
axes[1].set_yticklabels(waist_label)
# ② 增加描述信息
axes[0].set_ylabel("体重/KG",fontsize=16)
axes[0].set_xlabel("时间/周",fontsize=16)
axes[0].set_title("王女士&张女士体重变化情况",fontsize=16)
axes[1].set_ylabel("腰围/KG",fontsize=16)
axes[1].set_xlabel("时间/周",fontsize=16)
axes[1].set_title("王女士&张女士腰围变化情况",fontsize=16)
# ③ 增加图例
axes[0].legend(loc="upper center")
axes[1].legend(loc="upper center")
# ④ 增加背景网格
axes[0].grid(linestyle="--",alpha=0.5)
axes[1].grid(linestyle="--",alpha=0.5)
# 3. 展现图像
plt.show()
二、绘制柱状图
1、实例二
- 对比统计2019年度内地电影票房收入前10的电影
import matplotlib.pyplot as plt
# 创建画布
plt.figure(figsize=(20, 8),dpi = 80)
# 准备数据
movie_name = ["哪吒之魔童降世","流浪地球","复仇者联盟4:终局之战","我和我的祖国","中国机长","疯狂的外星人","飞驰人生","烈火·英雄",
"少年的你","速度与激情:特别行动"]
movie_total_BoxOffice = [49.19,46.40,41.91,30.24,28.52,21.92,17.09,16.76,15.42,14.07]
# 绘制图像
plt.bar(movie_name, movie_total_BoxOffice, width=0.5, color=["b","y","g","r","m","b", "c"])
# ① 修改x和y刻度
plt.xticks(rotation=45,fontsize=12)
plt.yticks(range(51)[::5], fontsize=12)
# ② 增加网格背景
plt.grid(linestyle="--", alpha=0.5)
# ③ 增加描述信息
plt.ylabel("总票房,单位:亿", fontsize=16)
plt.title("2019年度内地电影票房收入排名前十的影片", fontsize=16)
# 展示图像
plt.show()
2、完善实例二
- 对比同一时间的票房信息,如:首日和首周的票房情况
import numpy as np
import matplotlib.pyplot as plt
# 创建画布
plt.figure(figsize=(20, 8),dpi = 80)
# 准备数据
movie_name = ["哪吒之魔童降世","流浪地球","复仇者联盟4:终局之战","我和我的祖国","中国机长"]
movie_total_BoxOffice = [49.19,46.40,41.91,30.24,28.52]
first_day_BoxOffice = [1.38, 1.88, 5.35, 2.89, 2.05]
first_week_BoxOffice = [6.49, 19.98, 20.35, 20.59, 17.33]
# 绘制图像
# 核心:绘制时两种类别使用偏移量
width = 0.3
index = np.arange(len(movie_name))
plt.bar(movie_name, first_day_BoxOffice, width, color="b", label="首日票房")
plt.bar((index + width), first_week_BoxOffice, width, color="r",label="首周票房")
# ① 修改x和y刻度
plt.xticks(rotation=45, fontsize=15)
plt.yticks(range(51)[::5], fontsize=15)
# ② 增加网格背景
plt.grid(linestyle="--", alpha=0.3)
# ③ 增加描述信息
plt.ylabel("总票房,单位/亿", fontsize=18)
plt.title("2019年度内地电影票房排名前五的电影首映日和第一周票房统计情况", fontsize=18)
# ④ 增加图例
plt.legend(loc="upper center")
# 展示图像
plt.show()
三、绘制直方图
- 需求:
假设你获取了250部电影的时长(列表times中),希望统计出这些电影时长的分布状态(如时长为100分钟到120分钟电影的数量,出现的频率)等信息,应该如何呈现这些数据?
import matplotlib.pyplot as plt
# 1. 准备数据
times = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124,
101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113, 150, 110, 117, 86,
95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137,
123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114, 105, 115,
132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,
123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127,
115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134,
106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 114, 140, 103,
130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134,
106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146,
133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]
# 计算组数(将数据共分多少个组,计算公式:极差 / 组距,即(最大值-最小值)/组距 = 组数)
d = 3 #定义组距(每个小组两个端点的距离,即电影时长间隔分钟数)
num_bins = (max(times) - min(times)) // d
# 2. 创建画布
plt.figure(figsize=(20, 8), dpi = 80)
# 3. 绘制图像
plt.hist(times, num_bins, density=True) # 加上density=True属性之后变为频率分布直方图
# 设置x轴的刻度
plt.xticks(range(min(times), max(times)+d, d))
# 增加网格
plt.grid(linestyle="--", alpha=0.3)
# 3. 展示图像
plt.show()
四、绘制饼图
- 需求:
统计2020年8月13日内地日票房占比情况
import matplotlib.pyplot as plt
# 1. 准备数据
movie_name = ["1917", "星际穿越", "多利特的奇幻冒险", "极速车王", "刺猬索尼克", "喋血战士"]
tickets = [5672.4, 5010.7, 2888.7, 1422.1, 808.1, 511.6]
# 2. 创建画布
plt.figure(figsize=(20, 8), dpi = 80)
# 3. 绘制图像
color = ["y", "b", "m", "c","r", "g"]
font = {'fontsize':15,'color':'black'}
# 每一块饼图离开中心距离,默认值为(0,0,...),即不离开中心;
explode = (0.1,0,0,0,0,0) # 将第一块分离出来
# shadow表示显示阴影;counterclock指定指针方向,默认True表示逆时针;
# labeldistance指定label显示位置,相对于半径的比例,如<1则绘制在饼图内侧,默认值为1.1;
# pctdistance类似于labeldistance,指定autopct的位置刻度,默认值为0.6
plt.pie(tickets, labels=movie_name, autopct="%1.2f%%", colors = color, textprops = font,
explode=explode,shadow=True, pctdistance=0.4, labeldistance=0.8)
plt.axis("equal") # 保持饼图显示圆形,添加plt.axis("equal")使得长宽一样
# 增加图例
plt.legend()
# 添加描述
plt.title("2020年8月13日内地日票房占比情况", fontsize = 18)
# 4. 展示图片
plt.show()
五、matplotlib总结
1、matplotlib三层结构
-
容器层
- 画板层(Canvas)
- 画布层(Figure)——>创建画布(指定尺寸和像素[清晰度])
- 绘图区/坐标系(Axes)——>绘制图像——>结合辅助显示区使图更丰富
辅助显示层(在绘图区之上)——>修改x和y轴刻度、描述信息、图例等
图像层(在绘图区之上)——>根据数据描绘图像
2、不同类图形应用场景
常见图形 | 应用场景(关键字) | 绘制 |
---|---|---|
折线图 | 展现某事物(指标)随时间或者其他变化情况、各种数学函数 | matplotlib.plot(…) |
散点图 | 展现不同事物(指标/变量)之间的关系/规律 | matplotlib.scatter(…) |
柱状图 | 统计对比同一事物不同类别的大小或数量 | matplotlib.bar(…) |
直方图 | 展现某事物(指标)的分布状态 | matplotlib.hist(…) |
饼图 | 展现某事物的占比情况(一般不超过9个类别) | matplotlib.pie(…) |