携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
1. 多坐标系绘制
例如,我们有这样一个需求,想要在同一张画布上,显示多个坐标系,这时候,我们就需要用到多个坐标系绘制的相关语法-subplots(面向对象的画图方法)。
具体语法如下所示:
matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw)
- nrows:想设置有几行坐标系
- ncols:像设置有几列坐标系
- 该函数返回两个东西:fig(返回图对象)与axes(返回相应数量的坐标系)
注意:
- 使用
plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)创建画布以后,需要使用两个变量(fig, axes)接收返回值。 axes[0]表示对第一个图进行操作,axes[1]表示对第二个图进行操作,例如axes[0].plotaxes[0].set_xticks:添加x轴y轴刻度需要用到set_xticks或者set_xticks。但是如果有字符串需要单独用set_xticklabels进行设置。axes[0].grid:对第一个图添加网格显示axes[0].set_xlabel:对第一个图x轴添加描述信息axes[0].legend:开启第一个图的图例显示
2. 案例演示
案例需求:请在同一张画布中,绘制两个折线图。这两个折线图分别反应北京和上海两个城市,某一时段温度随时间变化关系。并且,为两个折线图分别设置图例,网格,坐标刻度,描述信息,坐标系显示等等。
具体代码演示如下所示:
import random
import matplotlib.pyplot as plt
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 0. 准备x,y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x] # 列表生成式
y_beijing = [random.uniform(1, 3) for j in x]
# 1. 创建多坐标系画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
# 2. 绘制折线图
axes[0].plot(x, y_shanghai, label='上海')
axes[1].plot(x, y_beijing, color='r', linestyle='--', label='北京')
# 显示图例
axes[0].legend(loc='best')
axes[1].legend(loc='best')
# 2.1 添加x,y轴刻度
# 设置x,y轴刻度
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 修改x,y轴坐标刻度显示
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5]) # 转字符串
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5]) # 转字符串
# 2.2 添加网格显示
axes[0].grid(True, linestyle='--', alpha=0.5) # 开启网格,虚线,透明度0.5
axes[1].grid(True, linestyle='--', alpha=0.5)
# 2.3 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点0分到12点之间的温度变化图示", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点0分到12点之间的温度变化图示", fontsize=20)
# 3. 显示图像
plt.show()
代码运行结果如下图所示:由下图可以看出,在同一个画布中能够分别显示两个折线图。