В 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()?

Ответы:


471

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

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


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()

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-й участок для текущего графика. Графики нумеруются вдоль верхнего ряда окна рисунка, затем второго ряда и т. Д.


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


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)в вопросе.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.