Как я могу сделать пустой участок в matplotlib?

86

Я делаю группу подзаговоров (скажем, 3 x 2) в matplotlib, но у меня меньше 6 наборов данных. Как я могу сделать оставшийся участок пустым?

Расположение выглядит так:

+----+----+
| 0,0| 0,1|
+----+----+
| 1,0| 1,1|
+----+----+
| 2,0| 2,1|
+----+----+

Это может продолжаться для нескольких страниц, но на последней странице есть, например, 5 наборов данных, и поле 2,1 будет пустым. Однако я назвал цифру как:

cfig,ax = plt.subplots(3,2)

Итак, в пространстве для подзаговора 2,1 есть набор осей по умолчанию с отметками и метками. Как я могу программно визуализировать это пространство пустым и без осей?

MishaF
источник

Ответы:

144

Вы всегда можете спрятать топоры, которые вам не нужны. Например, следующий код полностью отключает 6-ю оси:

import matplotlib.pyplot as plt

hf, ha = plt.subplots(3,2)
ha[-1, -1].axis('off')

plt.show()

и получается следующий рисунок:

Изображение сетки графиков 3x2 без графа, отображаемого в правой нижней ячейке

В качестве альтернативы см. Принятый ответ на вопрос. Скрытие текста оси в графиках matplotlib, чтобы узнать , как сохранить оси, но скрыть все украшения осей (например, отметки и метки).

Крис
источник
Спасибо - это даже ближе к моему первоначальному вопросу. Я уже принял другой ответ и адаптировал свой код для его использования, но оба подхода хороши.
mishaF 05
Круто, это действительно приятно, потому что здесь меньше add_subplot()беспорядка.
moooeeeep
Это изумительно!
FaCoffee,
Здесь нет сюжета, и можно сказать, что это пустой сюжет. Я искал график, на котором нет данных, чтобы явно показать, что данных нет. Любая простая модификация этого ответа, которая делает это?
Zelphir Kaltstahl 09
@Zelphir Я не уверен, что вам нужно: остальные пять графиков - это пустые графики без данных, поэтому я не уверен, что еще вы просите. Кроме того, это новый вопрос. В будущем задавайте это как новый вопрос, а не комментируйте старый ответ.
Крис
26

С того момента, как этот вопрос был задан впервые, в matplotlib был добавлен значительно улучшенный интерфейс подзаголовка . Здесь вы можете создать именно те сюжеты, которые вам нужны, не скрывая дополнительных функций. Кроме того, подзаголовки могут охватывать дополнительные строки или столбцы.

import pylab as plt

ax1 = plt.subplot2grid((3,2),(0, 0))
ax2 = plt.subplot2grid((3,2),(0, 1))
ax3 = plt.subplot2grid((3,2),(1, 0))
ax4 = plt.subplot2grid((3,2),(1, 1))
ax5 = plt.subplot2grid((3,2),(2, 0))

plt.show()

введите описание изображения здесь

Зацепил
источник
Вау - это хорошее улучшение. Так намного проще! Спасибо, @Hooked!
mishaF
@Hooked, последнее пустое место идеально подходит для добавления легенды. Вы знаете, как поставить там легенду?
Стефано
@Stefano уверен, что есть способы сделать это, но это лучше всего было бы сформулировать как новый вопрос, вы даже можете связать этот ответ в своем вопросе (кстати, добро пожаловать в StackOverflow!)
подключено
7

Также можно скрыть подзаголовок с помощью метода Axes.set_visible ().

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
data = pd.read_csv('sampledata.csv')

for i in range(0,6):
ax = fig.add_subplot(3,2,i+1)
ax.plot(range(1,6), data[i])
if i == 5:
    ax.set_visible(False)
Ник Ханкинс
источник
Ваш ответ хорош как для оригинальных Axes, так и для расширенных GeoAxes!
Фей Яо
1

Будет ли возможность создавать подзаговоры, когда они вам понадобятся?

import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt

plt.figure()
plt.gcf().add_subplot(421)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(422)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(423)
plt.fill([0,0,1,1],[0,1,1,0])
plt.suptitle("Figure Title")
plt.gcf().subplots_adjust(hspace=0.5,wspace=0.5)
plt.savefig("outfig")
муеее
источник
Я так не думаю, потому что мне нужно сделать еще кое-что, что я не включил в исходный вопрос для краткости. Один из них - plt.subplots_adjust (wspace = 0, hspace = 0). Я не уверен, что это сработает постфактум.
mishaF
@mishaF: вы можете использовать subplots_adjust (), используя этот подход. Смотрите мою правку.
moooeeeep