【1】引言
在python画图的众多场景中,存在多图对应X轴和Y轴可能一致的情形。
为此,尝试找到相关方法,不仅可以将代码写得更简洁,也更节省电脑内存,是提升工作效率的可选之路。
【2】官网教程
点击下方链接,直达官网教程:
Shared axis — Matplotlib 3.9.2 documentation
官网教程非常简洁,我尝试对其进行了注释。
【3】代码解析
首先是引入画图模块matplo和计算模块numpy:
import matplotlib.pyplot as plt #引入画图模块 import numpy as np #引入计算模块
然后定义了自变量和因变量:
t = np.arange(0.01, 5.0, 0.01) #定义自变量 s1 = np.sin(2 * np.pi * t) #定义因变量 s2 = np.exp(-t) #定义因变量 s3 = np.sin(4 * np.pi * t) #定义因变量
这里的3个因变量将输出3个子图。
接下来先输出第一个图形:
ax1 = plt.subplot(311) #输出第一个图形 plt.plot(t, s1) #画图 plt.tick_params('x', labelsize=6) #设置X轴范围
然后在定义第二个图形的时候,指明要和第一个图形共享X轴:sharex=ax1
# share x only ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴 plt.plot(t, s2) #画图 # make these tick labels invisible plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容
再之后定义第三个图形, 指明要和第一个图形共享X轴和Y轴:sharex=ax1,sharey=ax1
# share x and y ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴 plt.plot(t, s3) #画图 plt.xlim(0.01, 5.0) #限制X轴范围
最后输出图形:
plt.show() #输出图形
至此的输出图像为:
图1
完整代码为:
import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块
t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量
ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6) #设置X轴范围
# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容
# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围
plt.show() #输出图形
【4】代码修改
【4.1】设置子图名称
由于图1中没有给任何子图命名,且第一个和第三个子图都显示了X轴,为了优化表达效果,先给各个子图命名,增加如下代码:
ax1.set_title('s1') ax2.set_title('s2') ax3.set_title('s3')
获得输出结果为:
图2
可见每个子图上都有了名称。
【4.2】只显示最底下的X轴标签内容
现在进一步优化代码,把S1的X轴标签去除。
此处采用的方法是,增加labelbottom=False代码,增加后:
ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围
此时的输出结果为:
图3
由图3可见,S1不再显示X轴标签内容。
【4.3】显示最底下的X轴和各Y轴
继续增加代码,显示最底下的X轴和各Y轴:
ax1.set_ylabel('s1') ax2.set_ylabel('s2') ax3.set_ylabel('s3') ax3.set_xlabel('X')
此时的输出结果为:
图4
由图4可见,各个子图的表达已经更加完善。
此时的完整代码为:
import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块
t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量
ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围
# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容
# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围
ax1.set_title('s1') #设置图名
ax2.set_title('s2') #设置图名
ax3.set_title('s3') #设置图名
ax1.set_ylabel('s1') #设置Y轴
ax2.set_ylabel('s2') #设置Y轴
ax3.set_ylabel('s3') #设置Y轴
ax3.set_xlabel('X') #设置X轴
plt.show() #输出图形
【5】代码优化
其实共享X轴更为简洁的方式是将所有图形画到同一个坐标系。
删除所有ax定义,替换为下述代码:
plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置Y轴
plt.legend() #输出图例
此时的输出结果为:
图5
图5显然比之前的图形都更紧凑,展示内容也更集中。
当然,图5的选用应在曲线范围一致的情况下才有好的效果,不然还是需要回到之前的子图形式。
至此的完整代码为:
import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块
t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量
plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置X轴
plt.legend() #输出图例
plt.show() #输出图形
【6】总结
探索了多图共享X轴和Y轴的基本技巧,并对输出图形进行了图例、轴标签等属性设置,最后将所有曲线集中到一个坐标轴内部输出。