逐一添加子图
# 逐一添加绘图子区
import numpy as np
import matplotlib.pyplot as plt
PI = np.pi
x = np.linspace(0, 2*PI, 20)
# 绘图板1
fig1 = plt.figure(1, figsize=(6, 2)) # 创建绘图板1,figsize为绘图板尺寸
ax1 = fig1.add_subplot(121) # 在绘图板1指定位置添加一个绘图子区(坐标轴),\
# 参数121创建1行2列个子图,当前子图在第1个区域
ax1.plot(x, np.sin(x), x, np.sin(x+PI/2)) # 输入多组x、y数据,一个坐标系中绘制多条曲线
ax1.set_title("f(x)=sin(x)")
ax2 = fig1.add_subplot(122)
ax2.plot(x, np.cos(x), linestyle="--", color="orange")
ax2.set_title("f(x)=cos(x)")
fig1.tight_layout() # 默认自动调整多个子图间距
# 绘图板2
fig2= plt.figure(2, figsize=(6.8, 2)) # 创建绘图板2
ax3 = fig2.add_subplot(111)
ax3.plot([1, 2, 3]) # 只输入一个参数时,参数作为Y轴数据,X轴数据以索引自动生成
# 添加图中图
# 添加新的绘图子区,位置(0.5,0.75),宽高(0.05,0.1),相对尺寸
ax31 = fig2.add_axes([0.2, 0.55, 0.2, 0.25])
ax31.plot(x, np.sin(x), ls='--', color='orange')
ax32 = fig2.add_axes([0.65, 0.25, 0.2, 0.25])
ax32.plot(x, np.cos(x), ls='-', color='red')
plt.show()
创建一系列子图
# 一次创建多个绘图子区
import numpy as np
import matplotlib.pyplot as plt
PI = np.pi
x = np.linspace(0, 2*PI, 50)
# 创建一个绘图板和多个绘图子区
fig, ax = plt.subplots(2, 3, figsize=(10, 3), sharex=True, sharey=True)
# fig.set_size_inches(10, 3) # 调整绘图板尺寸
fig.set_dpi(100)
fig.tight_layout(h_pad=0.5, w_pad=0) # 调整绘图子区间距
# 按索引选择绘图子区绘图
# ax[0, 0].plot(x, np.sin(x))
# ax[1, 0].plot(x, np.cos(x))
# 通过for循环绘制一系列子图
n = 0
for i in range(2):
for j in range(3):
ax[i, j].plot(x, np.sin(x+n*PI/2)) # 图形每次左移PI/2
n += 1
ax[0, 0].set_xticks(np.linspace(0, 6, 10), minor=True)
ax[0, 0].grid(which='both', axis='both', ls='--')
# 添加图中图,位置(0.5,0.75),宽高(0.05,0.1),相对尺寸
ax1 = fig.add_axes([0.5, 0.75, 0.05, 0.1])
ax1.plot(x, np.sin(x))
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
plt.show()
共x轴绘图
# 共x轴绘图
import numpy as np
import matplotlib.pyplot as plt
PI = np.pi
x = np.linspace(0, 2*PI, 21)
fig1 = plt.figure(1, figsize=(6, 2))
ax1 = fig1.add_subplot(111)
ax1.set_ylabel("sine")
pic1 = ax1.plot(x, np.sin(x), label="sine(x)")
ax2 = ax1.twinx() # 两组数据公用一个x轴
ax2.set_ylabel("cosine")
pic2 = ax2.plot(x, np.cos(x) * 0.1, label="cosine(x)", linestyle="--", color="orange")
# 合并图例
pic = pic1 + pic2
labels = [i.get_label() for i in pic]
ax2.legend(pic, labels, loc="best", fontsize=10)
# fig1.legend(bbox_to_anchor=(0,0.5), fontsize=10) # 图例放在图外,bbox_to_anchor设定图例的位置,数值为相对比例
plt.show()
子图的设置
# 子图的设置
import numpy as np
import matplotlib.pyplot as plt
PI = np.pi
x = np.linspace(0, 2*PI, 21)
fig = plt.figure(figsize=(6,2))
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), linewidth=1, linestyle="-", marker="o", markersize=5,
markerfacecolor="orange", label="sin(x)")
ax.plot(x, np.sin(x+PI/2), linewidth=1, linestyle="--", marker="D", markersize=5, label="cos(x)")
ax.set_title("f(x)=sin(x)", fontsize=10)
ax.set_xlabel("x", fontsize=16)
ax.set_ylabel("sin(x)", fontsize=10)
ax.set_xticks(np.linspace(0, 2*PI, 5)) # x轴主刻度
ax.set_xticks(np.linspace(0, 2*PI, 21), minor=True) # x轴次刻度
ax.set_yticks(np.linspace(-1, 1, 3)) # y轴主刻度
ax.set_yticks(np.linspace(-1, 1, 5), minor=True) # y轴次刻度
ax.set_xticklabels(["0",r"$\frac{\pi}{2}$",r"$\pi$",r"$\frac{3\pi}{2}$",r"$2\pi$"]) # x轴主刻度标签
ax.set_xticklabels(["%.1f$\pi$" % (i/10) for i in range(21)], minor=True, fontsize=6) # x轴次刻度标签
# ax.set_axis_off() # 不显示坐标轴
ax.text(PI, 0, r"($\pi$,0)") # 在图上添加注释
ax.legend(loc="best", fontsize=12) # 添加图例
ax.grid(True, which="major", linewidth=1, axis="both") # 主网格
ax.grid(True, which="minor", linestyle="--", alpha=0.6) # 次网格
# ax.set_xlim(0, 2*PI) # 设置x轴范围
# ax.set_ylim(-1, 1) # 设置y轴范围
plt.show()