Как задать точные пределы 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. Вот код, который я использовал:
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 отобразить именно нужные пределы
-
Устанавливаем пределы на конкретном объекте
Axespythonfig, 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) -
Если предпочитаете интерфейс
pyplot, вызывайтеplt.ylimпосле всех рисовокpythonplt.ylim(bottom=20, top=250) # точные пределы plt.show() -
(Опционально) Переопределяем автоматическое «красивое» размещение делений
Если хочется, чтобы подписи делений тоже совпадали с пределами, задайте их явно:pythonax[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.