如何在matplotlib中更改当前轴实例(即gca())

60

我使用一个技巧画出高度与主轴匹配的色条。代码如下:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np

ax = plt.subplot(111)
im = ax.imshow(np.arange(100).reshape((10,10)))

# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)

plt.colorbar(im, cax=cax)

这个技巧很有效。然而,由于添加了一个新的轴,当前图像实例就变成了cax - 即添加的轴。因此,如果执行诸如

plt.text(0,0,'whatever')

文本将在cax上绘制,而不是im所属的轴ax。

与此同时,gcf().axes显示两个轴。

我的问题是:如何使当前轴实例(由gca()返回)成为im所属的原始轴。


我刚找到了一个快速的解决方法:只需在plt.text中指定'ax'参数为原始ax即可:plt.colorbar(im, cax=cax, ax=ax) - Liang
尝试使用“ax.text(0, 0, 'whatever')”。 - fjarri
@Bogdan,是的,我明白那个方法可行。但如果你想继续使用简单的plt.text(),那么这将打破工作流程。通过我在自己的评论中发布的快速解决方法,调用plt.colorbar(im, cax=cax, ax=ax)实际上会将gca()还原为ax。如果我想包装一个函数来绘制具有匹配高度的色条,这似乎更方便。 - Liang
2
无论你用什么方法,我只是提供了一种可能的解决方案。个人而言,我发现使用显式状态更容易(例如,“fig = plt.figure(...)”,“ax = fig.subplot(...)”,“ax.text(...)”等)。 - fjarri
1
我和@Bogdan一样认为。状态机正在幕后执行此操作(https://dev59.com/8GYq5IYBdhLWcg3wui0z#14261698),现在你必须担心隐藏的状态对你产生奇怪的影响。 - tacaswell
2个回答

111

使用plt.sca(ax)函数来设置当前的坐标轴。其中ax是你想要成为活动状态的Axes对象。


3
具体来说,plt.sca(ax) 中的 ax 是您想要成为当前轴的轴名称。 - Femkemilene

0
不必更改当前的Axes实例,可以直接在Figure中的Axes列表中索引所需的Axes实例(正如OP所提到的)。
plt.gcf().axes[0].text(0, 0, 'whatever')

或者在具体的示例中,由于子图已经分配给一个变量名,可以直接使用它。
ax.text(0, 0, 'whatever')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接