В Matplotlib, что означает аргумент в fig.add_subplot (111)?

472

Иногда я сталкиваюсь с таким кодом:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

Который производит:

Пример участка, созданного с помощью включенного кода

Я читаю документацию как сумасшедшую, но не могу найти объяснения 111. иногда я вижу 212.

Что значит аргумент fig.add_subplot()?

pleasedontbelong
источник

Ответы:

471

Это параметры сетки подзаговоров, закодированные как одно целое число. Например, «111» означает «сетка 1x1, первый субплот», а «234» означает «сетка 2x3, 4-й субплот».

Альтернативная форма add_subplot(111)IS add_subplot(1, 1, 1).

Constantin
источник
18
Есть ли подробная документация по этому поводу? В чем разница между сеткой 1x1 и сеткой 2x3 в этом контексте?
donatello
19
Сетка 1x1 = 1 строка, 1 столбец. Сетка 2х3 = 2 строки, 3 столбца. Третье число начинается с 1 и увеличивается в первую очередь. См. Документацию subplot () для получения дополнительной информации.
Кристиан Алис
18
Как объяснили другие (более двух лет назад), это наследие от Matlab. Но ради будущих читателей вы должны знать, что существует лучшая альтернатива в форме subplots()метода.
Jarondl
26
Документирование наследия subplot()находится здесь и subplots()находится здесь .
crayzeewulf
511

Я думаю, что это лучше всего объяснить следующей картиной:

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

Чтобы инициализировать вышеизложенное, нужно набрать:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()
SaiyanGirl
источник
19
Я думаю, что версия с запятыми гораздо более интуитивно понятна и удобочитаема, чем версия с 3-значными числами
эндолит
Это замечательно, это показывает, как «позиционировать подсюжеты в сетке», будь то сетка 2х2, как в приведенном выше примере, или сетка графиков 4х4 и т. Д. Но кто-то может объяснить, что определяет размер отображаемых графиков. Значения по умолчанию для (2,2,1) я нахожу довольно маленькими, мне бы хотелось, чтобы он был в два раза больше или больше.
yoshiserry
7
Это довольно полезно. Эта картина была бы немного лучше, если бы она не была квадратной (2х2), но в остальном очень полезной.
TravisJ
@TravisJ Ого, какое совпадение! Я думал об этом примерно за час до того, как ты это написал! Я скоро это
поменяю
7
Очень полезный ответ! Хотя я думаю, что редактирование является неточным. Поведение, охватывающее подзаговоры с помощью операторов типа 1: 2 или [1 3], не поддерживается Matplotlib (по крайней мере, не в 1.5.0) и, по-видимому, только для Matlab. (Обратите внимание, что в Matplotlib есть и другие варианты для достижения этой цели, например, gridspec )
лабораторная работа
39

Ответ от Константина точен, но для большей информации это поведение унаследовано от Matlab.

Поведение Matlab объясняется в разделе « Настройка рисунков - отображение нескольких графиков на рисунок » документации Matlab.

subplot (m, n, i) разбивает окно рисунка на матрицу m-by-n маленьких вспомогательных участков и выбирает i-й участок для текущего графика. Графики нумеруются вдоль верхнего ряда окна рисунка, затем второго ряда и т. Д.

DaveTM
источник
2
Это Matplotlib, а не Matlab.
dom0
45
Большая часть поведения matplotlibs унаследована от Matlab. Поскольку документация Matlab была лучше, я подумал, что она может помочь объяснить, как ведет себя этот конкретный вызов функции. Да, вы правы, это (вопрос) касается matplotlib. Документация Matplotlib сюжетные менее ясно , на мой взгляд.
DaveTM
7
Документация MATLAB перенесена .
dotancohen
20

Мое решение

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

Сетка 2х2 с объединением 1 и 3

yoonghm
источник
15

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

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

Первый код создает первый субплот в макете, который имеет 3 строки и 2 столбца.

Три графика в первом столбце обозначают 3 строки. Второй график располагается чуть ниже первого графика в том же столбце и так далее.

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

Притц
источник
10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = количество строк
  • COLUMN = количество столбцов
  • POSITION = положение графика, который вы строите

Примеры

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

Всего 2 строки, 1 столбец, поэтому можно построить 2 подграфа. Его расположение 1-е. Всего 2 строки, 1 столбец, поэтому можно построить 2 подграфа. Расположение 2-го

Рамез Ахмад Дар
источник
2

Метод add_subplot () имеет несколько сигнатур вызовов:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- с 3.1.0

Звонки 1 и 2:

Вызовы 1 и 2 достигают того же, что и один другой (до предела, объясненного ниже). Подумайте о них, как о первых, указав расположение сетки с их первыми 2 числами (2x2, 1x8, 3x4 и т. Д.), Например:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

Оба производят расположение подзаговоров (3 x 4 = 12) в 3 рядах и 4 столбцах. Третье число в каждом вызове указывает , какой оси объекта возврата, начиная с 1 в верхнем левом углу , увеличивая вправо .

Этот код иллюстрирует ограничения использования вызова 2:

#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

подзаговоры

Вы можете видеть с помощью вызова 1 на LHS, что вы можете вернуть любой объект оси, однако с вызовом 2 на RHS вы можете вернуть только до индекса = 9, отображая подпункты j), k) и l), недоступные с помощью этого вызова.

Т.е. это иллюстрирует этот пункт из документации:

pos - это трехзначное целое число, где первая цифра - это число строк, вторая - количество столбцов, а третья - индекс подзаговора. то есть fig.add_subplot (235) аналогичен fig.add_subplot (2, 3, 5). Обратите внимание, что для работы этой формы все целые числа должны быть меньше 10 .


Звоните 3

В редких случаях add_subplot может вызываться с одним аргументом - экземпляром осей подплота, уже созданным на данном рисунке, но не в списке осей рисунка.


Звоните 4 (с 3.1.0):

Если позиционные аргументы не передаются, по умолчанию используется значение (1, 1, 1).

т.е. воспроизводить звонок fig.add_subplot(111)в вопросе.

compuphys
источник