2013-02-25 1 views
9

У меня есть проблема, похожая на ту, что была размещена here. Разница в том, что я получаю нежелательные пробелы внутри области графика, когда я рисую два подзаголовка, которые разделяют оси через атрибуты sharex и sharey. Белые пробелы сохраняются даже после установки autoscale(False). Например, используя аналогичный код, как и в ответ на пост упомянутого выше:matplotlib.pyplot.imshow: удаление пробелов в пределах участков при использовании атрибутов «sharex» и «sharey»

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(2, 1, 1) 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax2 = fig.add_subplot(2, 1, 2, sharex=ax, sharey=ax) # adding sharex and sharey 
ax2.imshow(np.random.random((10,10))) 
ax2.autoscale(False) 
plt.show() 

приводит к this изображений.

Я также пробовал ax.set_xlim(0, 10) и ax.set_xbound(0, 10) согласно предложениям here, но безрезультатно. Как я могу избавиться от лишних пробелов? Любые идеи были бы хорошы.

ответ

14

Как предложил here, добавив:

ax.set_adjustable('box-forced') 
ax2.set_adjustable('box-forced') 

решает эту проблему.

(documentation)

+0

Это полезно, но я бы добавил еще один способ, если вы не возражаете потерять соотношение сторон и хотите заполнить все пространство доступных осей: используйте 'aspect = 'auto'' в' imshow() '. – PlasmaBinturong

1

Проблема заключается в полезном оборудовании с использованием add_subplot. Обратите внимание, что при изменении размера рисунка изменяется количество пробелов.

Следующая, кажется, работает (пока вы не изменить размер рисунка)

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(5, 5)) 
ax = fig.add_axes([.3, .55, .35, .35]) 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax2 = fig.add_axes([.3, .05, .35, .35], sharex=ax, sharey=ax) 
ax2.imshow(np.random.random((10,10))) 
ax2.autoscale(False) 

plt.show() 

Это выглядит как плохое взаимодействие между размером/расположение axes объекта, общих осей, и равное соотношение сторон от imshow.

Если вы можете жить с вне клещи, вы можете сделать

ax.set_axis_off() 
ax2.set_axis_off() 

Я думаю, что стоит открывать вопрос о Matplotlib GitHub для этого.

+1

Установка 'аспект = auto' бы избавиться от белых пространств в этом случае, но это не всегда идеально. Я открыл вопрос на matplotlib github, как вы сказали - спасибо. – mlynn

3

Использование plt.subplots как:

fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, sharey=False) 
ax[0].imshow(np.random.random((10,10))) 
ax[0].autoscale(False) 
ax[1].imshow(np.random.random((10,10))) 
ax[1].autoscale(False) 

я this figure без белых пространств внутри осей. Используя figsize в пределах plt.subplots или fig.subplots_adjust, вы можете получить лучшие отношения осей.

+0

Спасибо. Тем не менее, я хотел бы получить решение, в котором диапазоны осей не изменяются при изменении размера фигуры. – mlynn

+0

@mlynn: что вы имеете в виду? Вы хотите, чтобы ваши оси всегда были одинакового абсолютного размера (например, 5x5 см)? или вы хотите, чтобы они поддерживали одинаковое соотношение сторон независимо от размера фигуры? –

+0

Я хочу, чтобы для каждого подзаголовка отображались полные размеры изображения (в данном случае 10x10 пикселей), поддерживая одинаковое соотношение сторон независимо от размера фигуры. В принципе, если я не добавлю опции «sharex» и «sharey» в свой первоначальный код выше, я получу графики, которые я хочу. Я могу изменить размер фигуры, и каждый подзаголовок изменит размер соответственно. Причина, по которой мне хотелось бы, чтобы оси были разделены, заключается в том, что, когда я увеличиваю масштаб на одном подзаголовке, я хотел бы, чтобы другой подзаголовок увеличивался соответствующим образом. – mlynn

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