2016-07-22 2 views
4

Как определить, является ли подзаголовок (AxesSubplot) пустым или нет? Я хотел бы деактивировать пустые оси пустых подзаговоров и удалить полностью пустые строки.Удалить пустые подзаголовки в matplotlib figure

Например, на этом рисунке заполняются только два подзаголовка, а остальные подсети пусты.

import matplotlib.pyplot as plt 

# create figure wit 3 rows and 7 cols; don't squeeze is it one list 
fig, axes = plt.subplots(3, 7, squeeze=False) 
x = [1,2] 
y = [3,4] 

# plot stuff only in two SubAxes; other axes are empty 
axes[0][1].plot(x, y) 
axes[1][2].plot(x, y) 

# save figure 
plt.savefig('image.png') 

Примечание: Необходимо установить squeeze в False.

В основном я хочу редкую фигуру. Некоторые подсети в строках могут быть пустыми, но они должны быть деактивированы (оси не должны быть видимыми). Полностью пустые строки должны быть удалены и не должны быть установлены в невидимые.

+0

Вы можете использовать subplot2grid? – DavidG

+0

Я думаю, что это будет возможно, но как решить мою проблему, определяя пустые подзаголовки? – hotsplots

+0

См. Мой ответ, чтобы узнать, относится ли это к вашей проблеме. – DavidG

ответ

4

Один из способов достижения того, что вам нужно, - использовать функцию matplotlibs subplot2grid. Используя это, вы можете установить общий размер сетки (3,7 в вашем случае) и выбрать только отображение данных в определенных подзаговорах в этой сетке. Я адаптировал свой код, чтобы дать пример:

import matplotlib.pyplot as plt 

x = [1,2] 
y = [3,4] 

fig = plt.subplots(squeeze=False) 
ax1 = plt.subplot2grid((3, 7), (0, 1)) 
ax2 = plt.subplot2grid((3, 7), (1, 2)) 

ax1.plot(x,y) 
ax2.plot(x,y) 

plt.show() 

Это дает следующий график:

enter image description here

EDIT:

Subplot2grid, по сути, это даст вам список осей. В исходном вопросе вы используете fig, axes = plt.subplots(3, 7, squeeze=False), а затем используйте axes[0][1].plot(x, y), чтобы указать, на какой основе будут отображаться ваши данные. Это то же самое, что и в том, что делает subplot2grid, кроме этого отображает только подсети с данными в них, которые вы определили.

Итак, в моем ответе выше, здесь я указал форму «сетки», которая равна 3 на 7. Это означает, что я могу иметь 21 подзаголовку в этой сетке, если захочу, точно так же, как вы, исходный код. Разница в том, что ваш код отображает все подзадачи, в то время как subplot2grid - нет. (3,7) в ax1 = ... выше определяет форму всей сетки, а (0,1) указывает, где в будет отображена сетка подзаголовка.

Вы можете использовать любую позицию в подстроке везде, где хотите, в сетке 3x7. Вы также можете заполнить все 21 пробел этой сетки подсети, у которых есть данные в них, если вам нужно, пройдя весь путь до ax21 = plt.subplot2grid(...).

+0

Это 'fig, axes = plt.subplots (3, 7, squeeze = False)' также список осей. Как получить аналогичный список осей с помощью 'subplot2grid'? – hotsplots

+0

Когда вы говорите «список осей», вы имеете в виду, что с помощью 'fig, axes = plt.subplots (3, 7, squeeze = False)' позволяет вам делать оси [0] [1] .plot (x, y) 'и выберите, какой субплат на самом деле отображается? – DavidG

+0

Я все равно обновил свой ответ, чтобы попытаться ответить на ваш комментарий (если я правильно понял). – DavidG

3

Вы можете использовать fig.delaxes() метод:

import matplotlib.pyplot as plt 

# create figure wit 3 rows and 7 cols; don't squeeze is it one list 
fig, axes = plt.subplots(3, 7, squeeze=False) 
x = [1,2] 
y = [3,4] 

# plot stuff only in two SubAxes; other axes are empty 
axes[0][1].plot(x, y) 
axes[1][2].plot(x, y) 

# delete empty axes 
for i in [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 
      18, 19, 20]: 
    fig.delaxes(axes.flatten()[i]) 

# save figure 
plt.savefig('image.png') 
plt.show(block=False) 
Смежные вопросы