子图中使用同名/异名坐标轴与无坐标轴绘图的差异探究
Matplotlib三种子图绘图方式的差异分析
虽然这三种方式输出的图形看起来完全一致,但在代码逻辑、后续操作灵活性以及可维护性上存在明显差异,具体如下:
1. 同名坐标轴变量绘图
from matplotlib import pyplot as plt plt.figure(figsize=(10,5)) ax = plt.subplot(1, 2, 1) ax.plot(temperature, months) ax = plt.subplot(1, 2, 2) ax.plot(temperature, flights_to_hawaii, 'o')
这种方式复用了同一个变量名ax存储子图的坐标轴对象。第一次赋值得到第一个子图的Axes实例,但第二次赋值会直接覆盖掉之前的引用——这意味着绘图完成后,你再也无法通过ax变量访问第一个子图的坐标轴了。如果后续想给第一个子图加坐标轴标签、调整刻度样式或者修改图例,都会因为丢失引用而无法操作。
2. 异名坐标轴变量绘图
from matplotlib import pyplot as plt plt.figure(figsize=(10,5)) ax1 = plt.subplot(1, 2, 1) ax1.plot(temperature, months) ax2 = plt.subplot(1, 2, 2) ax2.plot(temperature, flights_to_hawaii, 'o')
这是Matplotlib面向对象编程的标准写法,用不同变量名ax1、ax2分别保存两个子图的Axes实例。两个子图的引用都被完整保留,后续可以独立对任意一个子图做精细化调整:比如给ax1设置x轴标题,给ax2修改y轴刻度范围,甚至给其中一个子图添加双坐标轴,操作起来清晰且灵活,尤其适合复杂的多子图绘图场景。
3. 不使用显式坐标轴变量绘图
from matplotlib import pyplot as plt plt.figure(figsize=(10,5)) plt.subplot(1, 2, 1) plt.plot(temperature, months) plt.subplot(1, 2, 2) plt.plot(temperature, flights_to_hawaii, 'o')
这是Matplotlib的状态机(pyplot)接口模式,依赖“当前活跃子图”的上下文来绘图:每次调用plt.subplot()会把对应的子图设为当前活跃对象,plt.plot()会自动在这个活跃子图上绘制。如果后续需要修改某个子图,你得先通过plt.subplot(1,2,1)重新激活它,或者用plt.gca()获取当前活跃的坐标轴,但这种方式在代码复杂、子图数量多的时候很容易搞混操作对象,可维护性较差,更适合快速绘制简单图形。
内容的提问来源于stack exchange,提问作者Young Jun Joo
相关产品推荐
相关产品推荐

