pyplot - понимание matplotlib.subplots python



seaborn subplots (1)

Различные типы возвращаемых данных обусловлены аргументом ключевого слова squeeze для plt.subplots() который по умолчанию имеет значение True . Давайте дополним документацию соответствующими распаковками:

squeeze: bool, необязательно, по умолчанию: True

  • Если True, дополнительные размеры выдавливаются из возвращенного объекта Axes:

    • если создается только один подзаговор (nrows = ncols = 1), результирующий одиночный объект Axes возвращается как скаляр.
      fig, ax = plt.subplots()
    • для подзаголовков Nx1 или 1xN возвращаемый объект - это массив 1D-объектов с неразборчивыми объектами Axes, которые возвращаются как массивы с 1-мерными массивами.
      fig, (ax1, ..., axN) = plt.subplots(nrows=N, ncols=1) (для Nx1)
      fig, (ax1, ..., axN) = plt.subplots(nrows=1, ncols=N) (для 1xN)
    • для NxM вспомогательные участки с N> 1 и M> 1 возвращаются как двумерные массивы.
      fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)
  • Если значение False, сжатие вообще не выполняется: возвращаемый объект Axes всегда является двумерным массивом, содержащим экземпляры Axes, даже если он заканчивается размером 1x1.
    fig, ((ax,),) = plt.subplots(nrows=1, ncols=1, squeeze=False)
    fig, ((ax,), .. ,(axN,)) = plt.subplots(nrows=N, ncols=1, squeeze=False) для Nx1
    fig, ((ax, .. ,axN),) = plt.subplots(nrows=1, ncols=N, squeeze=False) для 1xN
    fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)

В качестве альтернативы вы всегда можете использовать распакованную версию

fig, ax_arr = plt.subplots(nrows=N, ncols=M, squeeze=False)

и индексировать массив для получения осей ax_arr[1,2].plot(..) .

Так что для сетки 2 x 3 на самом деле не имеет значения, если вы установите squeeze в False . Результатом всегда будет двумерный массив. Вы можете распаковать его как

fig, ((ax1, ax2, ax3),(ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3)

иметь ax{i} в качестве объектов осей matplotlib, или вы можете использовать упакованную версию

fig, ax_arr = plt.subplots(nrows=2, ncols=3)
ax_arr[0,0].plot(..) # plot to first top left axes
ax_arr[1,2].plot(..) # plot to last bottom right axes

С некоторой помощью я построил набор круговых диаграмм. Вставьте изображение в срез круговой диаграммы. Мои диаграммы выглядят великолепно, теперь мне нужно поместить все 6 из них в фигуру 2x3 с общими отметками на общих осях x и y. Для начала я смотрю на сюжеты и думал, что смогу заставить его работать. Я скачал несколько примеров и начал пробовать несколько вещей.

    f, (a) = (plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True))#,
                 #squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n')#,type(b))

выходы:

класс 'matplotlib.figure.Figure'

класс 'matplotlib.axes._subplots.AxesSubplot'

в то время как:

    f, (a) = (plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n')#,type(b))

возвращает:

класс 'matplotlib.figure.Figure'

класс 'numpy.ndarray'

Когда я делаю это:

f, (a,b) = (plt.subplots(nrows=2, ncols=1, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

Я получаю аналогичные результаты, однако, если nrows = 1 и ncols = 2, я получаю ошибку:

    f, (a,b) = (plt.subplots(nrows=1, ncols=2, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

ValueError: недостаточно значений для распаковки (ожидаемое 2, полученное 1)

но опять же это:

    f, (a , b) = (
    plt.subplots(nrows=1, ncols=2, sharex=True, sharey=True))#,
                 #squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

дает класс 'matplotlib.figure.Figure'

класс 'matplotlib.axes._subplots.AxesSubplot'

класс 'matplotlib.axes._subplots.AxesSubplot'

Почему это либо массив, либо оси, а также почему 2X1 работает, а 1X2 - нет? Я хочу, чтобы на небеса я мог лучше понять документацию. Благодарю.





plot