如何在Matplotlib中以编程方式选择特定的子图?

时间:2011-08-18 01:03:38

标签: geometry matplotlib axes subplot

所以在figure中添加了add_subplot的三个垂直子图,我怎样才能选择让我们说中间的?

现在我做这个列表理解:

[r[0] for r in sorted([[ax, ax.get_geometry()[2]] for ax in self.figure.get_axes()], key=itemgetter(1))]

我只需选择我想要的索引,并使用相应的axes。有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:16)

来自matplotlib documentation

  

如果该图已经有一个带有键(args,kwargs)的子图,那么它只会使该子图变为当前并返回它。

以下是一个例子:

import matplotlib.pyplot as plt

fig = plt.figure()  
for vplot in [1,2,3]:
    ax = fig.add_subplot(3,1,vplot)
    ax.plot(range(10),range(10))

ax_again = fig.add_subplot(3,1,2)
ax_again.annotate("The middle one",xy=(7,5),xytext=(7,5))

plt.show()

再次调用中间图,以便可以对其进行注释。

如果我使用原始呼叫设置背景怎么办?当我第二次获得子剧情时,是否需要再次设置?

是。原始调用的参数和关键字用于创建唯一标识符。因此,为了使图形再次生成此唯一标识符,您需要再次传递相同的参数(网格定义,位置)和关键字。例如:

import matplotlib.pyplot as plt

fig = plt.figure()  
ax = fig.add_subplot(2,1,1,axisbg='red')
ax.plot(range(10),range(10))
ax = fig.add_subplot(2,1,2)
ax.plot(range(10),range(10))

ax_again = fig.add_subplot(2,1,1,axisbg='red')
ax_again.annotate("The top one",xy=(7,5),xytext=(7,5))

plt.show()

如果我使用 ax_again.change_geometry() 怎么办?

你会想到change_geometry,例如从312到422,将改变你使用add_subplot的方式,但事实并非如此。调用change_geometry时似乎存在错误或未定义的行为。使用参数和关键字生成的原始唯一键到第一个add_subplot调用,不会更新。因此,如果要通过add_subplot调用返回轴,则需要使用原始参数和关键字调用add_subplot。有关详细信息,请按照此问题报告: https://github.com/matplotlib/matplotlib/issues/429

我现在的猜测是,如果在使用add_subplot调用生成子图后更改子图的任何属性,则不会调整唯一属性。所以只需使用原始参数和关键字,希望这将成功。