Matplotlib.pyplot - исправить только одно ограничение по оси, установить другое в auto

Следующий MWE создает простой график рассеяния:

import numpy as np
import matplotlib.pyplot as plt

# Generate some random two-dimensional data:
m1 = np.random.normal(size=100)
m2 = np.random.normal(scale=0.5, size=100)

# Plot data with 1.0 max limit in y.
plt.figure()
# Set x axis limit.
plt.xlim(0., 1.0)
# Plot points.
plt.scatter(m1, m2)
# Show.
plt.show()

На этом графике пределы оси x установлены на [0., 1.]. Мне нужно установить верхний предел оси y равным 1. оставляя нижний предел до любого минимального значения в m2 (т.е. Пусть python определяет нижний предел).

В этом конкретном случае я мог бы просто использовать plt.ylim(min(m2), 1.0), но мой фактический код намного сложнее, поскольку много построенных объектов, поэтому это не вариант.

Я пробовал настройку:

plt.ylim(top=1.)

а также:

plt.gca().set_ylim(top=1.)

как указано здесь Как установить "авто" для верхнего предела, но сохраните фиксированный нижний предел с помощью matplotlib.pyplot, но ни одна из команд не работает. Они оба правильно установили верхний предел в оси y равным 1. но они также вынуждают нижний предел 0., который я не хочу.

Я использую Python 2.7.3 и Matplotlib 1.2.1.

Ответ 1

Если проблема заключается в том, что много данных строятся, почему бы не получить нижний у-лимит графика и использовать это при настройке пределов?

plt.ylim(plt.ylim()[0], 1.0)

Или аналогично для конкретной оси. Немного уродливый, но я не вижу причин, почему он не должен работать.


Проблема фактически заключается в том, что установка пределов перед построением графика отключает автомасштабирование. Пределы для осей x и y по умолчанию равны (0.0, 1.0), поэтому нижний предел y остается равным 0.

Решение - просто установить пределы графика после вызова всех команд построения. Или вы можете повторно включить автомасштабирование при необходимости