如何以编程方式在 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 选择正确的后端
如何在特定文件夹中的 iCloud 上传图像并在目标 C 中以编程方式访问该特定文件夹