我试图在不扩展或修改其限制的情况下绘制现有轴。
例如:
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--')
扩展了轴限制,大概是在新数据周围创建填充。
如何在没有填充的情况下画一条线?
答案 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--')
答案 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()
答案 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轴。