【问题标题】:How does plt.gca work internallyplt.gca 如何在内部工作
【发布时间】:2017-07-28 20:04:52
【问题描述】:

我在谷歌上搜索过,但没有得到答案。我创建了一个由 2 个轴组成的子图并调用 plt.gca() 但每次它只引用我的子图轴中的最后一个轴。然后我开始怀疑是否可以通过传入一些 kwargs 来获得特定的轴,但没有找到这样的参数。我真的很想知道 plt.gca() 是如何工作的,以及为什么你不能指定要获取哪个轴。

【问题讨论】:

    标签: matplotlib


    【解决方案1】:

    gca 表示“获取当前坐标区”。

    这里的“当前”表示它提供了最后一个活动轴的句柄。如果还没有轴,将创建一个轴。如果您创建两个子图,则最后创建的子图是当前子图。

    不存在gca(something) 这样的东西,因为这会转化为“获取当前坐标轴,而不是当前坐标轴”——听起来已经不合逻辑了,不是吗?

    确保您拥有绘图中任何轴的句柄的最简单方法是自己创建该句柄。例如

    ax = plt.subplot(121)
    ax2 = plt.subplot(122)
    

    然后您可以在之后的任何时候使用axax2 来操作选择的轴。

    还可以考虑使用subplots(注意s)命令,

    fig, (ax, ax2) = plt.subplots(ncols=2)
    

    如果您没有句柄或忘记创建一个句柄,您可能会得到一个,例如通过

    all_axes = plt.gcf().get_axes()
    ax = all_axes[0]
    

    获取第一个轴。由于绘图中没有轴的自然顺序,因此只有在没有其他选项可用时才应使用此选项。

    【讨论】:

    • 感谢您的回答!真的很感激。
    • @aldnoah 如果有帮助,请记住accept 的答案,这对社区整体来说是一件好事。
    • @Importance 在您的回答中包含对plt.sca() 的简短讨论可能是值得的。
    • @saintsfan342000 为了使用sca,您需要一个坐标区句柄plt.sca(ax)。但是如果你已经有一个轴柄,你可以直接使用它。所以我不确定这是否有帮助。但是,如果您认为 sca 在这里可以提供帮助,您当然可以提供自己的答案。
    【解决方案2】:

    作为对 Importance 非常好的答案的补充,我想我会指出 the pyplot command sca,它代表“设置当前轴”。

    它将轴作为参数并将其设置为当前轴,因此您仍然需要对轴的引用。但是有些人可能会发现有用的关于 sca 的事情是,您可以拥有多个轴并在所有轴上工作,同时仍然使用 pyplot 接口而不是面向对象的方法。

    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = plt.subplot(121)
    ax2 = plt.subplot(122)
    
    # Check if ax2 is current axes
    print(ax2 is plt.gca())
    # >>> True
    
    # Plot on ax2
    plt.plot([0,1],[0,1])
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # Now set ax as current axes
    plt.sca(ax)
    
    print(ax2 is plt.gca())
    # >>> False
    print(ax is plt.gca())
    # >>> True
    
    # We can call the exact same commands as we did for ax2, but draw on ax
    plt.plot([0,1],[0,1])
    plt.xlabel('X')
    plt.ylabel('Y')
    
    plt.show()
    

    因此您会注意到,我们能够重用相同的代码来绘制两个轴并为其添加标签。

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2010-10-14
      • 2013-09-28
      • 2012-08-01
      • 2011-12-10
      • 2018-02-10
      • 2014-09-29
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多