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

Posted

技术标签:

【中文标题】如何以编程方式在 Matplotlib 中选择特定的子图?【英文标题】:How can I programmatically select a specific subplot in Matplotlib? 【发布时间】:2011-10-29 09:35:00 【问题描述】:

所以在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】:

来自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 调用生成子图后更改子图的任何属性,则不会调整唯一性。因此,只需使用原始参数和关键字,希望这会奏效。

【讨论】:

伙计,我花了几个小时翻阅这些文档,但我仍然设法忽略了那个重要部分。谢谢 我希望我能彻底理解 matplotlib。这肯定会让我的工作更轻松。我也花了一段时间,从文档中梳理出这些细节绝对不容易。我想看看你是否在第一次调用中传递了 kwargs,你是否必须像文档建议的那样第二次传递完全相同的值。如果我想出任何东西,我会更新。 所以结果证明 figure 类有一个私有成员函数 _make_key '(makes) a hashable key out of args and kwargs';这用于识别子图(我猜所有轴都属于一个图形)。所以是的,您需要精确地使用相同的参数和关键字。 感谢您的提示。我想我将不得不探索_make_key 功能。我在使用 add_subplot 获取旧的子图时遇到了一些问题,这些子图的几何形状已用 change_geometry 更改。 所以我猜这不是预期的行为,我已经提交了问题报告:github.com/matplotlib/matplotlib/issues/429 如果你想使用 change_geometry,你可以,但要稍后取回子图,你需要使用原始参数和关键字调用它。当您调用 change_geometry 时,它会更改几何图形,但不会告诉图形这一点,因此图形仍使用旧几何图形来定义该子图的唯一键。 add_subplot 使用旧几何图形再次访问它。这有意义吗?

以上是关于如何以编程方式在 Matplotlib 中选择特定的子图?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 上以编程方式为 Matplotlib 选择正确的后端

以编程方式在 DataGridView 中选择一行

如何在特定文件夹中的 iCloud 上传图像并在目标 C 中以编程方式访问该特定文件夹

如何以编程方式连接到 Android 中的特定 Wi-Fi 网络?

以编程方式选择输入字段中的部分文本

Kendo Grid 如何以编程方式聚焦网格单元并阻止选择文本