【发布时间】:2017-07-28 20:04:52
【问题描述】:
我在谷歌上搜索过,但没有得到答案。我创建了一个由 2 个轴组成的子图并调用 plt.gca() 但每次它只引用我的子图轴中的最后一个轴。然后我开始怀疑是否可以通过传入一些 kwargs 来获得特定的轴,但没有找到这样的参数。我真的很想知道 plt.gca() 是如何工作的,以及为什么你不能指定要获取哪个轴。
【问题讨论】:
标签: matplotlib
我在谷歌上搜索过,但没有得到答案。我创建了一个由 2 个轴组成的子图并调用 plt.gca() 但每次它只引用我的子图轴中的最后一个轴。然后我开始怀疑是否可以通过传入一些 kwargs 来获得特定的轴,但没有找到这样的参数。我真的很想知道 plt.gca() 是如何工作的,以及为什么你不能指定要获取哪个轴。
【问题讨论】:
标签: matplotlib
gca 表示“获取当前坐标区”。
这里的“当前”表示它提供了最后一个活动轴的句柄。如果还没有轴,将创建一个轴。如果您创建两个子图,则最后创建的子图是当前子图。
不存在gca(something) 这样的东西,因为这会转化为“获取当前坐标轴,而不是当前坐标轴”——听起来已经不合逻辑了,不是吗?
确保您拥有绘图中任何轴的句柄的最简单方法是自己创建该句柄。例如
ax = plt.subplot(121)
ax2 = plt.subplot(122)
然后您可以在之后的任何时候使用ax 或ax2 来操作选择的轴。
还可以考虑使用subplots(注意s)命令,
fig, (ax, ax2) = plt.subplots(ncols=2)
如果您没有句柄或忘记创建一个句柄,您可能会得到一个,例如通过
all_axes = plt.gcf().get_axes()
ax = all_axes[0]
获取第一个轴。由于绘图中没有轴的自然顺序,因此只有在没有其他选项可用时才应使用此选项。
【讨论】:
plt.sca() 的简短讨论可能是值得的。
sca,您需要一个坐标区句柄plt.sca(ax)。但是如果你已经有一个轴柄,你可以直接使用它。所以我不确定这是否有帮助。但是,如果您认为 sca 在这里可以提供帮助,您当然可以提供自己的答案。
作为对 Importance 非常好的答案的补充,我想我会指出 the pyplot command sca,它代表“设置当前轴”。
它将轴作为参数并将其设置为当前轴,因此您仍然需要对轴的引用。但是有些人可能会发现有用的关于 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()
因此您会注意到,我们能够重用相同的代码来绘制两个轴并为其添加标签。
【讨论】: