如何在不扩展轴范围的情况下进行绘图?

时间:2018-10-10 14:54:36

标签: matplotlib

我试图在不扩展或修改其限制的情况下绘制现有轴。

例如:

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 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

设置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 :(得分:0)

一种暴力解决方案是在绘制之前跟踪轴限制,然后在绘制之后将其重置。

像这样:

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--')

答案 3 :(得分:0)

如果单独设置x轴限制,则无论您绘制了什么内容,它们都不会被覆盖,除非您对其进行更改。使其与您的代码相结合,请尝试:

plt.xlim(xlim)

当您获得xlim时,它将获得当前限制,但是一旦您“设置”了它们,它们就会被锁定,直到您再次更改它们为止。如果您也希望将其固定(也就是将“ x”替换为“ y”并添加代码),则这也适用于y轴。