import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.linspace(-10, 10)
y = x**2
fig = plt.figure('f1', figsize=(6, 4), dpi=50, facecolor='gray', frameon=True)
plt.plot(x, y)
figure 是绘制对象(可理解为一个空白的画布),一个 figure 对象可以包含多个 Axes 子图,一个 Axes 是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。
我们是在图形对象上面的 Axes 区域进行作画
绘制子图的几种方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uiEiLPlJ-1648631193276)(attachment:image.png)]
# 首先创建画布对象
fig = plt.figure(facecolor='g',figsize=(6, 4), dpi=80)
# ax1 从画布起始位置绘制,宽度和高度与画布一致
ax1 = fig.add_axes([0, 0, 1, 1])
# ax2 从画布 20% 的位置开始绘制,宽度和高度是画布的 50%
ax2 = fig.add_axes([0.2, 0.2, 0.5, 0.5])
# 在区域中作画
ax1.plot(x, y)
ax2.plot(x, y)
只有区域对象才可调用 plot() 方法,图形对象是不可以调用的。 但是plt.plot() 却不会报错,是因为 plt 默认返回的是一个区域,验证一下。
fig = plt.figure()
ax1 = fig.add_axes([0, 0, 1, 1])
ax2 = fig.add_axes([0.2, 0.2, 0.5, 0.5])
plt.plot(x, y, color='g')
plt.plot(x, x, color='r')
plt.plot(x, 2*x, color='b')
若在 ax2 后面调用plt.plot() 会默认返回 ax2 区域
fig = plt.figure()
ax1 = fig.add_axes([0, 0, 1, 1])
plt.plot(x, y, color='g')
plt.plot(x, x, color='r')
ax2 = fig.add_axes([0.2, 0.2, 0.5, 0.5])
plt.plot(x, 2*x, color='b')
# 创建 2行2列的子图,返回图形对象(画布),所有子图的区域
fig, axes = plt.subplots(2, 2)
x = np.arange(-2, 5)
ax1 = axes[0][0]
ax1.plot(x, x**2)
ax1.set_title('square')
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('sqrt')
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')
axes[1][1].plot(x, np.log10(x))
axes[1][1].set_title('log10')
# 处理遮挡标题
plt.tight_layout()
C:\Users\11434\AppData\Local\Temp/ipykernel_13664/2890334170.py:9: RuntimeWarning: invalid value encountered in sqrt
axes[0][1].plot(x, np.sqrt(x))
C:\Users\11434\AppData\Local\Temp/ipykernel_13664/2890334170.py:15: RuntimeWarning: divide by zero encountered in log10
axes[1][1].plot(x, np.log10(x))
C:\Users\11434\AppData\Local\Temp/ipykernel_13664/2890334170.py:15: RuntimeWarning: invalid value encountered in log10
axes[1][1].plot(x, np.log10(x))