Улучшить размер/интервал подзаголовка со многими подзадачами в matplotlib

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

Мне нужно создать целую кучу вертикально-уложенных графиков в matplotlib. Результат будет сохранен с помощью figsave и просмотрен на веб-странице, поэтому мне все равно, насколько высок конечный образ, если промежуточные фрагменты разнесены, поэтому они не перекрываются.

Независимо от того, насколько велика я допускаю фигуру, подсети всегда кажутся перекрывающимися.

Мой код в настоящее время выглядит как

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)

Ответ 1

Попробуйте использовать plt.tight_layout

В качестве быстрого примера:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

Без плотной компоновки

enter image description here


С плотной маской enter image description here

Ответ 2

Вы можете использовать plt.subplots_adjust, чтобы изменить интервал между подзаголовками (источник)

подпись вызова:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

Значения параметров (и предлагаемые значения по умолчанию):

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

Фактические значения по умолчанию управляются rc файлом

Ответ 3

Я обнаружил, что subplots_adjust (hspace = 0.001) - это то, что закончилось для меня. Когда я использую space = None, между каждым сюжетом все еще остается пробел. Установка его на что-то очень близкое к нулю, похоже, заставляет их выстраиваться в линию. То, что я загрузил здесь, не самый элегантный фрагмент кода, но вы можете видеть, как работает hspace.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

enter image description here

Ответ 4

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

Метод plt.subplots_adjust:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

или

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

Размер изображения имеет значение.

"Я пробовал общаться с hspace, но увеличение его только, кажется, делает все графики меньшими, не устраняя проблему перекрытия".

Таким образом, чтобы сделать больше пробелов и сохранить размер подзаголовки, общее изображение должно быть больше.

Ответ 5

Вы можете попробовать subplot_tool()

plt.subplot_tool()

Ответ 6

Как и в tight_layout тягой- tight_layout matplotlib теперь (начиная с версии 2.2) предоставляет функцию constrained_layout. В отличие от tight_layout, который может вызываться в любое время в коде для одного оптимизированного макета, constrained_layout - это свойство, которое может быть активным и оптимизировать макет перед каждым шагом рисования.

Следовательно, его нужно активировать до или во время создания подзаговора, например, figure(constrained_layout=True) или subplots(constrained_layout=True).

Пример:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

enter image description here

constrained_layout также может быть установлен через rcParams

plt.rcParams['figure.constrained_layout.use'] = True

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

Ответ 7

Это сводило меня с ума. Как упоминалось ранее, размер имеет значение. Как только я масштабировал размер своей фигуры, чтобы он соответствовал размерам моих графиков, это работало отлично:

попробуй это:

a=[]
r=71
c=33
w=10
ncols=6
for i in range(0,ncol):
    a.append(np.random.random((r,c)))
fig, axs = plt.subplots(1, ncol, figsize=(ncols*c/w,w))
fig.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0)
for i in range(0,ncols):
    axs[i].imshow(a[i],cmap='magma') #because magma is cool