【问题标题】:How can I programmatically select a specific subplot in Matplotlib?如何以编程方式在 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。有没有更直接的方法?

【问题讨论】:

    标签: geometry matplotlib axes subplot


    【解决方案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 使用旧几何图形再次访问它。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多