add_axes
和 add_subplot
都可以向图形中添加坐标轴。它们都返回一个 (子类的) matplotlib.axes.Axes
对象。
然而,用于添加坐标轴的机制存在明显差异。
add_axes
add_axes
的调用签名是 add_axes(rect)
,其中 rect
是一个列表 [x0, y0, width, height]
,表示新坐标轴在画布上的左下角 (x0,y0)
和其宽度与高度。因此,该坐标轴以绝对坐标定位在画布上。例如:
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
在画布中放置一个与画布本身大小完全相同的图形。
add_subplot
add_subplot
的调用签名并没有直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴应该位于哪里。通常和最简单的指定位置的方法是使用三个整数的标记法。
fig = plt.figure()
ax = fig.add_subplot(231)
1
)。为了只产生一个单独的坐标轴,将使用add_subplot(111)
(在1x1子图网格上的第一个图)。(在较新的matplotlib版本中,也可以使用没有任何参数的add_subplot()
。)add_subplot(111)
将产生一个坐标轴位于[0.125,0.11,0.775,0.77]
或类似位置,这已经为标题和(刻度)标签周围的坐标轴留出足够的空间。然而,这个位置可能会因绘图中的其他元素、设置的标题等而改变。它也可以使用pyplot.subplots_adjust(...)
或pyplot.tight_layout()
进行调整。add_subplot
将是为画布上的图形创建坐标轴的首选方法。只有在需要精确定位的情况下,add_axes
可能有用。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)
fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")
fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")
plt.tight_layout()
plt.show()
获取一个或多个子图及其句柄的最简单方法是使用 plt.subplots()
。对于一个轴,可以使用以下方式:
fig, ax = plt.subplots()
fig, axes = plt.subplots(nrows=3, ncols=4)
在初始问题中,使用fig.add_axes([0,0,1,1])
放置了一个轴,使其紧贴图形边界。当然,这样做的缺点是刻度、刻度标签、轴标签和标题都被裁剪掉了。因此,在回答评论中,我建议使用fig.add_subplot
,因为它会自动为这些元素留出足够的空间,并且如果这还不够,可以使用pyplot.subplots_adjust(...)
或pyplot.tight_layout()
进行调整。
@ImportanceOfBeingErnest的答案很棒。
但在这种情况下,通常需要为绘图生成坐标轴,add_axes()
的开销太大了。
因此,一个小技巧是像@ImportanceOfBeingErnest的答案一样使用add_subplot(111)
。
然而,更优雅和简单的替代方案是:
hAx = plt.figure(figsize = (10, 10)).gca()
projection
:hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')