代码之家  ›  专栏  ›  技术社区  ›  shadowtalker

如何在不扩展轴限制的情况下绘图?

  •  0
  • shadowtalker  · 技术社区  · 6 年前

    我试图在现有轴上绘制,而不扩展或修改其限制。

    例如:

    import numpy as np
    import matplotlib.pyplot as plt
    
    xy = np.random.randn(100, 2)
    
    plt.scatter(xy[:,0], xy[:,1])
    

    绘制具有良好拟合轴限制的精细绘图。

    然而,当我试图在上面画一条线时:

    xlim = plt.gca().get_xlim()
    plt.plot(xlim, xlim, 'k--')
    

    轴限制被扩展,可能是为了在新数据周围创建填充。

    4 回复  |  直到 6 年前
        1
  •  2
  •   ImportanceOfBeingErnest    6 年前

    设置 plt.autoscale(False) 防止发生自动缩放。

    import numpy as np; np.random.seed(42)
    import matplotlib.pyplot as plt
    
    xy = np.random.randn(100, 2)
    # By default plots are autoscaled. 
    plt.scatter(xy[:,0], xy[:,1])
    
    #Turn autoscaling off
    plt.autoscale(False)
    xlim = plt.gca().get_xlim()
    plt.plot(xlim, xlim, 'k--')
    
    plt.show()
    

    enter image description here

        2
  •  2
  •   Diziet Asahi    6 年前

    你可以用 the autoscale property of Axes objects

    根据文件:

    Axes.autoscale(enable=True, axis='both', tight=None)
    

    将轴视图自动缩放到数据(切换)。

    参数:

    enable : bool or None, optional
             True (default) turns autoscaling on, False turns it off. None leaves the autoscaling state unchanged.
    axis : {'both', 'x', 'y'}, optional
           which axis to operate on; default is 'both'
    tight: bool or None, optional
           If True, set view limits to data limits; if False, let the locator
           and margins expand the view limits; if None, use tight scaling
           if the only artist is an image, otherwise treat tight as False.
           The tight setting is retained for future autoscaling until it is
           explicitly changed.
    
    fig, ax = plt.subplots()
    ax.plot(np.random.normal(size=(100,)),np.random.normal(size=(100,)),'bo')
    ax.autoscale(tight=True)
    xlim = ax.get_xlim()
    plt.plot(xlim, xlim, 'k--')
    

    enter image description here

        3
  •  0
  •   Jgd    6 年前

    如果单独设置x轴限制,则在更改之前不会覆盖这些限制,无论打印的是什么。要使其与代码相匹配,请尝试:

    plt.xlim(xlim)
    

    当你得到xlim,它会得到当前的限制,但一旦你'设置'他们,他们被锁定,直到你改变他们再次。这也适用于y轴,如果您希望这些也被修复(只需将“x”替换为“y”并添加代码)。

        4
  •  0
  •   shadowtalker    6 年前

    一种强力解决方案是在绘图前跟踪轴限制,然后在绘图后重置。

    像这样:

    from contextlib import contextmanager
    
    @contextmanager
    def preserve_limits(ax=None):
        """ Plot without modifying axis limits """
        if ax is None:
            ax = plt.gca()
    
        xlim = ax.get_xlim()
        ylim = ax.get_ylim()
    
        try:
            yield ax
        finally:
            ax.set_xlim(xlim)
            ax.set_ylim(ylim)
    

    现在比较一下

    plt.scatter(xy[:,0], xy[:,1])
    
    xlim = plt.gca().get_xlim()
    plt.plot(xlim, xlim, 'k--')
    

    具有

    plt.scatter(xy[:,0], xy[:,1])
    
    with preserve_limits():
        xlim = plt.gca().get_xlim()
        plt.plot(xlim, xlim, 'k--')