2013-04-07 2 views
110

Я хотел бы ограничить оси X и Y в matplotlib, но для специального подзаголовка. Как я вижу, сама фигура подзаголовка не имеет никакого свойства оси. Я хочу, например, изменить только лимиты для второго сюжета!Как установить xlim и ylim для подзадачи в matplotlib

import matplotlib.pyplot as plt 
fig=plt.subplot(131) 
plt.scatter([1,2],[3,4]) 
fig=plt.subplot(132) 
plt.scatter([10,20],[30,40]) 
fig=plt.subplot(133) 
plt.scatter([15,23],[35,43]) 
plt.show() 
+0

, как вы делаете в подзаговоры? Пожалуйста, покажите нам, что вы делаете. – tacaswell

+0

Это более чем один способ сделать это ??? – Cupitor

+0

Ваш вопрос был не ясен, я могу думать о том, может ли 4 или 5 способов настроить что-то такое простое с суб-графиками. – tacaswell

ответ

151

Вы должны изучить немного интерфейса OO для matplotlib, а не только интерфейс конечной машины. Почти все функции plt.* - это тонкие обертки, которые в основном делают gca().*.

plt.subplot возвращает axes объект. Если у вас есть ссылки на ось объект можно построить непосредственно к нему, изменить свои пределы, и т.д.

import matplotlib.pyplot as plt 

ax1 = plt.subplot(131) 
ax1.scatter([1, 2], [3, 4]) 
ax1.set_xlim([0, 5]) 
ax1.set_ylim([0, 5]) 


ax2 = plt.subplot(132) 
ax2.scatter([1, 2],[3, 4]) 
ax2.set_xlim([0, 5]) 
ax2.set_ylim([0, 5]) 

и так далее по многим осям, как вы хотите.

или лучше, завернуть все это в цикле:

import matplotlib.pyplot as plt 

DATA_x = ([1, 2], 
      [2, 3], 
      [3, 4]) 

DATA_y = DATA_x[::-1] 

XLIMS = [[0, 10]] * 3 
YLIMS = [[0, 10]] * 3 

for j, (x, y, xlim, ylim) in enumerate(zip(DATA_x, DATA_y, XLIMS, YLIMS)): 
    ax = plt.subplot(1, 3, j + 1) 
    ax.scatter(x, y) 
    ax.set_xlim(xlim) 
    ax.set_ylim(ylim) 
+1

Проблема с сохранением экземпляра оси заключается в том, что он не обладает всеми свойствами, которые имеет plt, например, нельзя использовать axis.ylim(), чтобы получить ylim графика на оси. – dashesy

+5

@ dashy Вы используете 'set_xlim' и' set_ylim'. 'plt' имеет множество опций _fewer_, чем работать непосредственно с объектом axes. Фактически, почти каждая функция в 'plt' является очень тонкой оболочкой, которая сначала вызывает' ax = plt.gca() ', а затем вызывает то, что когда-либо функционирует на этом объекте. Вы не должны использовать 'plt' для чего-либо, кроме интерактивной работы. – tacaswell

+1

Да, я согласен, не полагаясь на интерактивную версию, предпочтительнее, но нет возможности * получить * ylim сюжета, имеющего только ось. После того, как график будет выполнен, он будет иметь ** автоматический ** ylim, но ось не будет иметь эту информацию. Поэтому, если последние рисунки зависят от ylim, как вы сказали, нужно set_ylim переопределить текущий диапазон. – dashesy

Смежные вопросы