设置xlim后如何根据屏幕上显示的数据自动设置ylim

问题描述 投票:0回答:4

例如,我设置xlim后,ylim比屏幕上显示的数据点范围更宽。当然,我可以手动选择一个范围并设置它,但我更喜欢自动完成。

或者,至少,我们如何确定屏幕上显示的数据点的 y 范围?

设置 xlim 后立即绘制: plot right after I set xlim

我手动设置 ylim 后的绘图: plot after I manually set ylim

python matplotlib plot
4个回答
7
投票

此方法适用于

y(x)
非线性的情况。给定要绘制的数组
x
y

lims = gca().get_xlim()
i = np.where( (x > lims[0]) &  (x < lims[1]) )[0]
gca().set_ylim( y[i].min(), y[i].max() )
show()

2
投票

要确定 y 范围,您可以使用

ax = plt.subplot(111)
ax.plot(x, y)
y_lims = ax.get_ylim()

这将返回当前 y 限制的元组。

然而,您可能需要通过在 x 限制处查找 y 数据的值来自动设置 y 限制。有很多方法可以做到这一点,我的建议是:

import matplotlib.pylab as plt
ax = plt.subplot(111)
x = plt.linspace(0, 10, 1000)
y = 0.5 * x
ax.plot(x, y)
x_lims = (2, 4)
ax.set_xlim(x_lims)

# Manually find y minimum at x_lims[0]
y_low = y[find_nearest(x, x_lims[0])]
y_high = y[find_nearest(x, x_lims[1])]
ax.set_ylim(y_low, y_high)

该功能归功于本文中的unutbu

import numpy as np
def find_nearest(array,value):
    idx = (np.abs(array-value)).argmin()
    return idx

然而,当数据 y 数据非线性时,这会出现问题。


2
投票

我发现@Saullo Castro 的答案很有用,并略有改进。您很可能想要调整限制许多不同的图。

import numpy as np
def correct_limit(ax, x, y):   
   # ax: axes object handle
   #  x: data for entire x-axes
   #  y: data for entire y-axes
   # assumption: you have already set the x-limit as desired
   lims = ax.get_xlim()
   i = np.where( (x > lims[0]) &  (x < lims[1]) )[0]
   ax.set_ylim( y[i].min(), y[i].max() ) 

0
投票

对于绘制多条线的情况,对先前答案的小改进:

def autoset_ylim(ax): # after ax.set_xlim((xstart,xend))
    xlim = ax.get_xlim()
    ymin = None ; 
    ymax = None;
    for line in ax.lines:
        x=line.get_xdata()
        y=line.get_ydata()
        i = np.where( (x > xlim[0]) &  (x < xlim[1]) )[0]
        if ymin == None:
            ymin = y[i].min()
            ymax = y[i].max()
        else:
            ymin = min(ymin,y[i].min())
            ymax = max(ymax,y[i].max())
    ax.set_ylim((ymin,ymax))
    return 
© www.soinside.com 2019 - 2024. All rights reserved.