Как правильно автоматизировать размещение fig.suptitle при отображении широких изображений с помощью imshow в matplotlibPython

Программы на Python
Anonymous
Как правильно автоматизировать размещение fig.suptitle при отображении широких изображений с помощью imshow в matplotlib

Сообщение Anonymous »

Проблема в том, что fig.suptitle и ax.imshow (с широкими изображениями) плохо работают вместе. Я понимаю, что существуют некоторые препятствия с соотношением сторон (или чем-то еще), которые необходимо преодолеть из-за того, что изображение широкое, а фигура квадратная.
Тем не менее, я хочу знать формулу или набор параметров конфигурации mpl, которые я могу использовать. поэтому я могу последовательно размещать заголовок независимо от размера изображения или размера сетки.

Что-то вроде F(image_shape, figsize) -> config / location того, как напрямую разместить заголовок над графиком
Например:

Код: Выделить всё

import matplotlib.pyplot as plt
import numpy as np
mat5x10 = (np.arange(5*10).reshape((5,10))%2 == 0)
fig,ax = plt.subplots()
ax.imshow(mat5x10)
fig.suptitle("mat 5x10")
_ = plt.show()
приводит к слишком высокому заголовку:
Изображение

Я знаю, что могу использовать ax.set_title, чтобы разместить его лучше

Код: Выделить всё

mat5x10 = (np.arange(5*10).reshape((5,10))%2 == 0)
fig,ax = plt.subplots()
ax.imshow(mat5x10)
ax.set_title("mat 5x10")
_ = plt.show()
Изображение

но этого недостаточно, когда я создаю несколько графиков. видите, что заголовок идет еще дальше, чтобы учесть несколько столбцов.

Код: Выделить всё

fig,axes = plt.subplots(ncols =2)
mat5x10 = (np.arange(5*10).reshape((5,10))%2 == 0)
axes[0].imshow(mat5x10)

mat2_5x10 = (np.arange(5*10).reshape((5,10))%2 == 1)
axes[1].imshow(mat2_5x10)

fig.suptitle("Two mats")
_ = plt.show()
дает еще худшее размещение,
Изображение

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

Код: Выделить всё

fig,axes = plt.subplots(ncols =2, figsize=(10,3))
mat5x10 = (np.arange(5*10).reshape((5,10))%2 == 0)
axes[0].imshow(mat5x10)

mat2_5x10 = (np.arange(5*10).reshape((5,10))%2 == 1)
axes[1].imshow(mat2_5x10)

fig.suptitle("Two mats")
_ = plt.show()
Изображение

Однако я не знаю, почему (10,3) работает для отображения двух матов (5x10). Я уверен, что это связано с соотношением сторон, но не знаю, как разработать метод правильного размещения этого заголовка независимо от того, какие изображения необычной формы я вставляю в рисунок.
такие вещи, как constrained_layout и Tight_layout кажутся неэффективными...
Совет?

Подробнее здесь: https://stackoverflow.com/questions/787 ... e-images-w

Вернуться в «Python»