Программирование

Как задать точные пределы Y‑оси в Matplotlib

Matplotlib округляет пределы оси Y. Узнайте, как задать точные значения (например, 20–250) с помощью Axes.set_ylim или plt.ylim(bottom=20, top=250).

Как задать пределы оси Y в Matplotlib на 20 и 250?
Я пробовал plt.ylim((25,250)), но график всё равно показывает пределы 20 и 200. Вот код, который я использовал:

python
import matplotlib.pyplot as plt

plt.figure(1, figsize=(8.5,11))
plt.suptitle('plot title')
ax = []
aPlot = plt.subplot(321, axisbg='w', title='Year 1')
ax.append(aPlot)
plt.plot(paramValues, plotDataPrice[0], color='#340B8C',
         marker='o', ms=5, mfc='#EB1717')
plt.xticks(paramValues)
plt.ylabel('Average Price')
plt.xlabel('Mark-up')
plt.grid(True)
plt.ylim((25,250))

С моими данными пределы остаются 20 и 200, но я действительно хочу 20 и 250. Что происходит?

Когда вы пишете plt.ylim((25,250)), Matplotlib действительно применяет эти пределы, но при этом округляет их до «красивых» чисел, чтобы деления оси выглядели аккуратно.
Поскольку ваши данные находятся далеко ниже 250, Matplotlib обычно поднимает верхний предел до 200 и округляет нижний до 20, поэтому на оси виден диапазон 20 – 200, хотя фактическое окно остаётся 25 – 250.

Как заставить Matplotlib отобразить именно нужные пределы

  1. Устанавливаем пределы на конкретном объекте Axes

    python
    fig, ax = plt.subplots(3, 2, figsize=(8.5, 11))   # сетка 3×2, берём ax[0] для года 1
    ax[0].plot(paramValues, plotDataPrice[0],
               color='#340B8C', marker='o', ms=5, mfc='#EB1717')
    ax[0].set_title('Year 1')
    ax[0].set_xlabel('Mark‑up')
    ax[0].set_ylabel('Average Price')
    ax[0].grid(True)
    
    # Точно задаём диапазон 20–250
    ax[0].set_ylim(bottom=20, top=250)          # или ax[0].set_ylim(20, 250)
    
  2. Если предпочитаете интерфейс pyplot, вызывайте plt.ylim после всех рисовок

    python
    plt.ylim(bottom=20, top=250)   # точные пределы
    plt.show()
    
  3. (Опционально) Переопределяем автоматическое «красивое» размещение делений
    Если хочется, чтобы подписи делений тоже совпадали с пределами, задайте их явно:

    python
    ax[0].set_yticks(np.linspace(20, 250, 6))  # 20, 60, 100, 140, 180, 220, 260
    

    или используйте ax[0].locator_params(axis='y', nbins=6), чтобы Matplotlib сам выбрал подходящее число делений.

Почему исходный код показывал 20–200

  • plt.ylim((25,250)) задаёт пределы просмотра, но Matplotlib автоматически округляет их до кратных 5 или 10, чтобы деления выглядели аккуратно.
  • Поскольку максимум ваших данных около 200, верхний предел округляется вниз до 200.
  • Нижний предел 25 округляется вниз до 20, что и приводит к отображению 20 – 200.

Устанавливая пределы через объект Axes (или используя аргументы bottom/top), вы обходите это округление и получаете точный диапазон, который вам нужен.

Для официальной справки по Axes.set_ylim и тому, как Matplotlib обрабатывает пределы, см. Matplotlib API reference.

Авторы
Проверено модерацией
Модерация