2013-08-11 3 views
2

Например, после того, как я установил xlim, ylim шире, чем диапазон точек данных, отображаемых на экране. Конечно, я могу вручную выбрать диапазон и установить его, но я бы предпочел, чтобы это было сделано автоматически.Как автоматически установить ylim из данных, отображаемых на экране после установки xlim

Или, по крайней мере, как мы можем определить y-диапазон точек данных, отображаемых на экране?

участок сразу после я установил xlim: plot right after I set xlim

участок после того, как я вручную установить ylim: plot after I manually set ylim

ответ

4

Этот подход будет работать в случае 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() 
+0

Благодаря Saullo, однако, автомасштаб (ось = «у») по-прежнему рассчитывает диапазон данных из полного набора данных, в том числе точек, не показанные на экране – Liang

+0

Спасибо за обратную связь .. Я обновил ответ для случая, когда 'y (x)' является нелинейным ... –

1

Для определения диапазона у вы можете использовать

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

который будет возвращать кортеж из текущих у пределов.

Похоже, что вам, вероятно, потребуется автоматизировать настройку пределов y путем нахождения значения y данных в пределах x. Есть много способов сделать это, мое предложение было бы это:

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 in this post

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

Это, однако, будет иметь проблемы, когда данные у данных не является линейными.

+1

Для меня ваш ответ наименее запутанный. Но может быть быстрое улучшение, что мы можем найти y_low и y_high, взяв min и max между y [find_nearest (x, x_lims [0])] и y [find_nearest (x, x_lims [1])], то есть : 'y_low = y [find_nearest (x, x_lims [0]): find_nearest (x, x_lims [1])]. min() y_high = y [find_nearest (x, x_lims [0]): find_nearest (x, x_lims [ 1])]. макс() '. – Liang

0

Я нашел ответ @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()) 
Смежные вопросы