add_axes 和 add_subplot 有什么区别?
What are the differences between add_axes and add_subplot?
在之前的 中,有人建议我使用 add_subplot
而不是 add_axes
来正确显示坐标轴,但是搜索文档时我无法理解何时以及为何我应该使用这些功能之一。
谁能解释一下区别?
共同点
两者,add_axes
and add_subplot
向图形添加轴。他们都 return a (a 的子类) matplotlib.axes.Axes
object.
但是,用于添加轴的机制有很大不同。
add_axes
add_axes
的调用签名是add_axes(rect)
,其中rect
是一个列表[x0, y0, width, height]
表示图中新轴的左下点坐标(x0,y0)
及其宽度和高度。所以轴在 canvas 上以绝对坐标定位。例如
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
在 canvas 中放置一个与 canvas 本身一样大的图形。
add_subplot
add_subplot
的调用签名不直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴的位置。指定此位置的通常且最简单的方法是 3 整数表示法,
fig = plt.figure()
ax = fig.add_subplot(231)
在此示例中,在 2 行 3 列的网格中的第一个位置 (1
) 创建了一个新轴。要仅生成单个轴,将使用 add_subplot(111)
(第一个图在 1 x 1 子图网格上)。 (在较新的 matplotlib 版本中,add_subplot()
也可以不带任何参数。)
这种方法的优点是 matplotlib 负责精确定位。默认情况下 add_subplot(111)
会产生一个位于 [0.125,0.11,0.775,0.77]
或类似位置的轴,它已经在标题和(刻度)标签的轴周围留下足够的 space 。但是,这个位置也可能会根据情节中的其他元素、标题集等而改变。
也可以使用 pyplot.subplots_adjust(...)
或 pyplot.tight_layout()
.
进行调整
在大多数情况下,add_subplot
是为 canvas 上的绘图创建坐标轴的首选方法。只有在精确定位很重要的情况下,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)
初始问题
在 initial question 中使用 fig.add_axes([0,0,1,1])
放置了一个轴,使其紧贴图形边界。这样做的缺点当然是刻度、刻度标签、轴标签和标题都被截掉了。因此,我在对答案的评论之一中建议使用 fig.add_subplot
,因为这将自动为这些元素提供足够的 space,如果这还不够,可以使用 [=31= 进行调整] 或 pyplot.tight_layout()
.
@ImportanceOfBeingErnest 的回答很棒。
然而在这种情况下,通常人们想要为绘图生成一个轴,而 add_axes()
的开销太大。
就像@ImportanceOfBeingErnest 的回答一样,一个技巧是使用 add_subplot(111)
.
然而更优雅和简单的选择是:
hAx = plt.figure(figsize = (10, 10)).gca()
如果你想要 3D
投影,你可以传递任何轴 属性。例如 projection
:
hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')
在之前的 add_subplot
而不是 add_axes
来正确显示坐标轴,但是搜索文档时我无法理解何时以及为何我应该使用这些功能之一。
谁能解释一下区别?
共同点
两者,add_axes
and add_subplot
向图形添加轴。他们都 return a (a 的子类) matplotlib.axes.Axes
object.
但是,用于添加轴的机制有很大不同。
add_axes
add_axes
的调用签名是add_axes(rect)
,其中rect
是一个列表[x0, y0, width, height]
表示图中新轴的左下点坐标(x0,y0)
及其宽度和高度。所以轴在 canvas 上以绝对坐标定位。例如
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
在 canvas 中放置一个与 canvas 本身一样大的图形。
add_subplot
add_subplot
的调用签名不直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴的位置。指定此位置的通常且最简单的方法是 3 整数表示法,
fig = plt.figure()
ax = fig.add_subplot(231)
在此示例中,在 2 行 3 列的网格中的第一个位置 (1
) 创建了一个新轴。要仅生成单个轴,将使用 add_subplot(111)
(第一个图在 1 x 1 子图网格上)。 (在较新的 matplotlib 版本中,add_subplot()
也可以不带任何参数。)
这种方法的优点是 matplotlib 负责精确定位。默认情况下 add_subplot(111)
会产生一个位于 [0.125,0.11,0.775,0.77]
或类似位置的轴,它已经在标题和(刻度)标签的轴周围留下足够的 space 。但是,这个位置也可能会根据情节中的其他元素、标题集等而改变。
也可以使用 pyplot.subplots_adjust(...)
或 pyplot.tight_layout()
.
在大多数情况下,add_subplot
是为 canvas 上的绘图创建坐标轴的首选方法。只有在精确定位很重要的情况下,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)
初始问题
在 initial question 中使用 fig.add_axes([0,0,1,1])
放置了一个轴,使其紧贴图形边界。这样做的缺点当然是刻度、刻度标签、轴标签和标题都被截掉了。因此,我在对答案的评论之一中建议使用 fig.add_subplot
,因为这将自动为这些元素提供足够的 space,如果这还不够,可以使用 [=31= 进行调整] 或 pyplot.tight_layout()
.
@ImportanceOfBeingErnest 的回答很棒。
然而在这种情况下,通常人们想要为绘图生成一个轴,而 add_axes()
的开销太大。
就像@ImportanceOfBeingErnest 的回答一样,一个技巧是使用 add_subplot(111)
.
然而更优雅和简单的选择是:
hAx = plt.figure(figsize = (10, 10)).gca()
如果你想要 3D
投影,你可以传递任何轴 属性。例如 projection
:
hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')