<p>虽然当他建议只绘制必要的数据时,<a href="https://stackoverflow.com/users/325565/joe-kington">Joe Kington</a>肯定会提出最合理的答案,但在某些情况下,最好绘制所有数据并缩放到某个部分。另外,最好有一个只需要axes对象的“autoscale_y”函数(即,与需要直接使用数据的答案<a href="https://stackoverflow.com/questions/25534524/matplotlib-scale-y-axis-based-on-manually-zoomed-x-axis">here</a>不同)</p>
<p>下面是一个函数,它仅根据可见x区域中的数据重新缩放y轴:</p>
<pre><code>def autoscale_y(ax,margin=0.1):
"""This function rescales the y-axis based on the data that is visible given the current xlim of the axis.
ax -- a matplotlib axes object
margin -- the fraction of the total height of the y-data to pad the upper and lower ylims"""
import numpy as np
def get_bottom_top(line):
xd = line.get_xdata()
yd = line.get_ydata()
lo,hi = ax.get_xlim()
y_displayed = yd[((xd>lo) & (xd<hi))]
h = np.max(y_displayed) - np.min(y_displayed)
bot = np.min(y_displayed)-margin*h
top = np.max(y_displayed)+margin*h
return bot,top
lines = ax.get_lines()
bot,top = np.inf, -np.inf
for line in lines:
new_bot, new_top = get_bottom_top(line)
if new_bot < bot: bot = new_bot
if new_top > top: top = new_top
ax.set_ylim(bot,top)
</code></pre>
<p>这是一个黑客,可能不会在很多情况下工作,但对于一个简单的情节,它工作得很好。</p>
<p>下面是一个使用此函数的简单示例:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-100,100,1000)
y = x**2 + np.cos(x)*100
fig,axs = plt.subplots(1,2,figsize=(8,5))
for ax in axs:
ax.plot(x,y)
ax.plot(x,y*2)
ax.plot(x,y*10)
ax.set_xlim(-10,10)
autoscale_y(axs[1])
axs[0].set_title('Rescaled x-axis')
axs[1].set_title('Rescaled x-axis\nand used "autoscale_y"')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/liWZq.png" rel="noreferrer"><img src="https://i.stack.imgur.com/liWZq.png" alt="enter image description here"/></a></p>