回答问题

在之前的回答中,建议我使用add_subplot而不是add_axes来正确显示轴,但是搜索文档我无法理解何时以及为什么应该使用这些功能中的任何一个。

谁能解释这些差异?

Answers

共同点

add_axesadd_subplot都向图形添加了轴。它们都返回一个(a 的子类)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的调用签名不直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴的位置。指定此位置的常用且最简单的方法是 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]或类似位置的轴,它已经在轴周围为标题和(刻度)标签留下了足够的空间。但是,这个位置也可能会根据情节中的其他元素、标题集等而改变。也可以使用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()进行调整。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐