Während Joe Kington sicherlich die vernünftigste Antwort schlägt, wenn er empfiehlt, dass nur die notwendigen Daten geplottet werden, gibt es Situationen, in denen es am besten wäre, alle Daten zu plotten und nur auf einen bestimmten Abschnitt zu zoomen. Außerdem wäre es schön, eine „autoscale_y“ Funktion zu haben, die nur die Achsen Objekt erfordert (dh im Gegensatz zu der Antwort here, die direkte Nutzung der Daten erfordert.)
Hier ist eine Funktion, die nur die y- neu skaliert Achse auf der Grundlage der Daten, die im sichtbaren x-Region:
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)
das ist etwas, wie ein Hack, und wird wahrscheinlich nicht in vielen Situationen arbeiten, aber für eine einfache Handlung, es funktioniert gut.
Hier ist ein einfaches Beispiel mit dieser Funktion ist:
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()
ich diese Idee auch hatte, aber ich wusste nicht, dass in Python so einfach Subset machen war :) – Pygmalion