встановлення межі осі у в matplotlib


416

Мені потрібна допомога з встановленням меж осі у на matplotlib. Ось код, який я спробував, безуспішно.

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 були.


1
Для мене працює Matplotlib 1.0.0, якщо я додаю plt.show()наприкінці, щоб показати сюжет. Яку версію та який бекенд ви використовуєте?
Тамас

14
Працює для мене з Matplotlib 0.98.5.2, Python 2.6.2. Я спробував і те, plt.ylim((25,250))і plt.ylim(ymax = 250, ymin = 25). Я використовую Aggбекенд.
Маной Говіндан

1
Дякую обом. Чи працює це з програмою PDF backkend.
Curious2learn

1
Примітка: axisbgтепер застаріло
SherylHohman

Відповіді:


616

Спробуйте це . Працює і для subplots.

axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])

201
До речі, це нерозумне абревіатура означає " g et the c urrent a xes".
Ленар Хойт

32
Ви також можете встановити одне значення, Noneяке залишає обчислення для matplotlib, наприкладaxes.set_ylim([ymin,None])
linqu

129

Ваш код працює і для мене. Однак іншим вирішенням може бути отримання осі ділянки, а потім зміна лише значень y:

x1,x2,y1,y2 = plt.axis()
plt.axis((x1,x2,25,250))


1
Ви можете просто встановити x1 і x2 None.
Hielke Walinga

78

Одне, що ви можете зробити - це самостійно встановити діапазон осей за допомогою matplotlib.pyplot.axis.

matplotlib.pyplot.axis

from matplotlib import pyplot as plt
plt.axis([0, 10, 0, 20])

0,10 - для діапазону осей x. 0,20 - для діапазону осей y.

або ви також можете використовувати matplotlib.pyplot.xlim або matplotlib.pyplot.ylim

matplotlib.pyplot.ylim

plt.ylim(-2, 2)
plt.xlim(0,10)

24

Ви можете створити об'єкт із нього matplotlib.pyplot.axesта викликати set_ylim()його. Це було б щось подібне:

import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_ylim([0, 1])

16

Це працювало принаймні у версії 2.2.2 для matplotlib:

plt.axis([None, None, 0, 100])

Ймовірно, це хороший спосіб налаштувати, наприклад, лише xmin та ymax тощо.


14

Щоб додати відповідь до @ Hima, якщо ви хочете змінити поточний ліміт x або y, ви можете скористатися наступним.

import numpy as np # you probably alredy do this so no extra overhead
fig, axes = plt.subplot()
axes.plot(data[:,0], data[:,1])
xlim = axes.get_xlim()
# example of how to zoomout by a factor of 0.1
factor = 0.1 
new_xlim = (xlim[0] + xlim[1])/2 + np.array((-0.5, 0.5)) * (xlim[1] - xlim[0]) * (1 + factor) 
axes.set_xlim(new_xlim)

Я вважаю це особливо корисним, коли хочу зменшити чи зменшити масштаб із налаштувань сюжету за замовчуванням.


7

Це має спрацювати. Ваш код працює для мене, як для Тамаша та Маной Говіндана. Схоже, ви можете спробувати оновити Matplotlib. Якщо ви не можете оновити Matplotlib (наприклад, якщо у вас недостатньо прав адміністратора), можливо, matplotlib.use()допоможе використання іншого сервера .


Дякуємо за перевірку! Я використовую резервний файл PDF ( matplotlib.use('PDF')). Я використовую версію, яка постачається з останньою версією Enthought Python Distribution. Ви можете, будь ласка, побачити, чи працює він із архівом PDF. Дякую!
Curious2learn

Це працює з архівом PDF у Mac OS X. Ви впевнені, що вихідний файл дійсно оновлений plt.savefig()?
Ерік О Лебігот

Я зрозумів проблему, думаю. Якщо я беру aPlot =в plt.subplotлінії це працює для мене теж. Здається, що якщо присвоїти субплоту подібну змінну, слід використовувати якийсь інший метод встановлення меж осей. Це правда?
Curious2learn

1
Наскільки я знаю, plt.ylim()застосовує обмеження до поточних осей, які встановлюються при виконанні plt.subplot(). Я також не можу повірити, що plt.subplot()дбає про те, як використовуються осі, які він повертає (поставлені в змінну чи ні, тощо). Тому я б сказав, що це має працювати; це працює на моїй машині.
Ерік О Лебігот

6

Просто для тонкої настройки. Якщо ви хочете встановити лише одну з меж осі, а інша межа залишиться незмінною, ви можете вибрати одне або кілька наступних висловлювань

plt.xlim(right=xmax) #xmax is your value
plt.xlim(left=xmin) #xmin is your value
plt.ylim(top=ymax) #ymax is your value
plt.ylim(bottom=ymin) #ymin is your value

Погляньте на документацію для xlim та ylim


0

Якщо осі (згенеровані кодом нижче коду, показаного у запитанні) ділять діапазон з першими осями, переконайтеся, що ви встановили діапазон після останньої графіки цих осей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.