Matplotlib plt.gca如何在内部工作

Matplotlib plt.gca如何在内部工作,matplotlib,Matplotlib,我在谷歌上搜索过,但没有得到答案。我创建了一个由2个轴组成的子地块,名为plt.gca(),但每次它都只引用子地块轴中的最后一个轴。然后我开始怀疑是否有可能通过传递一些kwargs来获得一个特定的轴,但没有找到这样的参数。我很想知道plt.gca()是如何工作的,以及为什么不能指定要获取哪个轴。gca的意思是“获取当前轴” 此处的“当前”表示它为最后一个活动轴提供一个控制柄。如果还没有轴,将创建一个轴。如果创建两个子地块,则最后创建的子地块就是当前子地块 没有gca(某物)这样的东西,因为这会转

我在谷歌上搜索过,但没有得到答案。我创建了一个由2个轴组成的子地块,名为plt.gca(),但每次它都只引用子地块轴中的最后一个轴。然后我开始怀疑是否有可能通过传递一些kwargs来获得一个特定的轴,但没有找到这样的参数。我很想知道plt.gca()是如何工作的,以及为什么不能指定要获取哪个轴。

gca
的意思是“获取当前轴”

此处的“当前”表示它为最后一个活动轴提供一个控制柄。如果还没有轴,将创建一个轴。如果创建两个子地块,则最后创建的子地块就是当前子地块

没有gca(某物)这样的东西,因为这会转化为“获取不是当前轴的当前轴”——听起来已经不合逻辑了,不是吗

确保绘图中任何轴都有控制柄的最简单方法是自己创建该控制柄。例如

ax = plt.subplot(121)
ax2 = plt.subplot(122)
然后,您可以在此后的任何时间点使用
ax
ax2
来操纵所选轴

也考虑使用<代码>子图(注释S)命令,

fig, (ax, ax2) = plt.subplots(ncols=2)
如果您没有句柄或忘记创建句柄,您可能会得到一个,例如通过

all_axes = plt.gcf().get_axes()
ax = all_axes[0]

获取第一个轴。由于绘图中没有轴的自然顺序,因此只有在没有其他选项可用的情况下才应使用此选项。

作为重要性非常好答案的补充,我想我会指出,它代表“设置当前轴”

它将轴作为参数并将其设置为当前轴,因此您仍然需要对轴的引用。但是关于
sca
一些人可能会发现有用的地方是,您可以拥有多个轴并处理所有轴,同时仍然使用pyplot接口而不是面向对象的方法

import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.subplot(121)
ax2 = plt.subplot(122)

# Check if ax2 is current axes
print(ax2 is plt.gca())
# >>> True

# Plot on ax2
plt.plot([0,1],[0,1])
plt.xlabel('X')
plt.ylabel('Y')

# Now set ax as current axes
plt.sca(ax)

print(ax2 is plt.gca())
# >>> False
print(ax is plt.gca())
# >>> True

# We can call the exact same commands as we did for ax2, but draw on ax
plt.plot([0,1],[0,1])
plt.xlabel('X')
plt.ylabel('Y')

plt.show()

因此,您会注意到,我们可以重复使用相同的代码来绘制并向两个轴添加标签。

谢谢您的回答!非常感谢。@aldnoah请记住这个答案,如果它有帮助的话,它对整个社区都有好处。@Importance在你的答案中包含一个关于
plt.sca()
的简短讨论可能是值得的。@saintsfan342000为了使用
sca
你需要一个轴手柄,
plt.sca(ax)
。但是,如果您已经有一个轴控制柄,您可以直接使用它。所以我不确定这是否有帮助。但是,如果您认为这个
sca
在这里有帮助,那么您当然可以提供自己的答案。