matplotlib 如何在不延伸轴限制的情况下进行绘图

zpjtge22  于 2023-06-23  发布在  其他
关注(0)|答案(4)|浏览(151)

我正在尝试在现有轴上绘制,而不扩展或修改它的限制。
例如:

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

轴限制被扩展,大概是为了在新数据周围创建填充。
我怎么画一条线没有这个填充?

pgvzfuti

pgvzfuti1#

设置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()

inn6fuwd

inn6fuwd2#

一种强力解决方案是在绘图之前跟踪轴的限制,并在绘图之后重置它们。
就像这样:

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

x0fgdtte3#

可以使用Axes对象的autoscale属性:
根据文件:

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

0pizxfdo

0pizxfdo4#

如果单独设置x轴限制,则无论打印什么,在更改它们之前,它们都不会被覆盖。要使其与您的代码配合,请尝试:

plt.xlim(xlim)

当你得到xlim时,它得到当前的限制,但是一旦你“设置”它们,它们就被锁定,直到你再次更改它们。这也适用于y轴,如果你想把它们也固定下来(只要把'x'换成'y'并添加代码)。

相关问题