Как правильно разместить субтитр? - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь отрегулировать suptitle над многопанельной фигурой, и мне трудно понять, как отрегулировать figsize и затем расположить субтитр.

Проблема в том, что вызов plt.suptitle("my title", y=...) для регулировки положения субтитра также корректирует размеры фигуры.Несколько вопросов:

  1. где на самом деле suptitle(..., y=1.1) ставится заголовок?Насколько я могу судить, документация для параметра y для suptitle указывает на matplotlib.text.Text , но я не знаю, что означают координаты фигуры, когда у вас есть несколько вспомогательных участков.

  2. как влияет размер фигуры при указании от y до suptitle?

  3. как вручную настроить размер фигуры и интервал (subplots_adjust?) добавить заголовок фигуры для каждой панели и название для всей фигуры, сохраняя размер каждого топора на фигуре?

Пример:

data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5))

a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)

plt.suptitle("a big long suptitle that runs into the title\n"*2, y=1.05);

enter image description here

Очевидно, что я могу каждый раз настраивать фигуру, но мне нужно решение, которое обычно работает без ручного вмешательства.Я пробовал как ограниченный макет, так и жесткий макетни один из них не работает надежно с фигурами любой сложности.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

1. Что означают координаты фигуры?

Координаты рисунка идут от 0 до 1, где (0,0) - левый нижний угол и (1,1) - верхний правый угол. Следовательно, координата y=1.05 немного выходит за пределы фигуры.

enter image description here

2. Как влияет размер фигуры при указании y для субтитра?

Указание y для субтитров никак не влияет на размер фигуры.

3a. Как вручную настроить размер и интервал между фигурами, чтобы добавить заголовок фигуры для каждой панели и субтитр для всей фигуры?

Во-первых, никто не добавил бы дополнительный перенос строки. То есть если вы хотите иметь 2 строки, не используйте 3 перевода строки (\n). Затем можно настроить параметры подзаговора по своему усмотрению, чтобы оставить место для заголовков. Например. fig.subplots_adjust(top=0.8) и используйте y <= 1, чтобы заголовок находился внутри рисунка.

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5))
fig.subplots_adjust(top=0.8)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)

plt.show()

enter image description here

3b. ... сохраняя размер каждого топора на рисунке?

Сохранение размера осей и все еще достаточно места для заголовков возможно только путем изменения общего размера рисунка.

Это может выглядеть следующим образом, где мы определяем функцию make_space_above, которая принимает массив осей в качестве входных данных, а также новый требуемый верхний предел в единицах дюймов. Так, например, вы пришли к выводу, что вам нужно 1 дюйм поля сверху для размещения ваших заголовков:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5), squeeze = False)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)


def make_space_above(axes, topmargin=1):
    """ increase figure size to make topmargin (in inches) space for 
        titles, without changing the axes sizes"""
    fig = axes.flatten()[0].figure
    s = fig.subplotpars
    w, h = fig.get_size_inches()

    figh = h - (1-s.top)*h  + topmargin
    fig.subplots_adjust(bottom=s.bottom*h/figh, top=1-topmargin/figh)
    fig.set_figheight(figh)


make_space_above(axes, topmargin=1)    

plt.show()

enter image description here

(слева: без вызова make_space_above; справа: с вызовом make_space_above(axes, topmargin=1))

0 голосов
/ 20 апреля 2019

... или используйте constrained_layout:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5), constrained_layout=True)

a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)

plt.suptitle("a big long suptitle that runs into the title\n"*2);

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...