Код: Выделить всё
import matplotlib.pyplot as plt
import numpy as np
N = 200
var_xx = 1**2 # var x = std x squared
var_yy = 1**2
cov_xy = 0.5
cov = np.array([[var_xx, cov_xy], [cov_xy, var_yy]])
rng = np.random.default_rng()
pairs = rng.multivariate_normal([0, 0], cov, size=N, check_valid="raise")
mosaic = [[".", "top"], ["left", "main"]]
fig, axarr = plt.subplot_mosaic(mosaic, constrained_layout=True, width_ratios=[0.5, 1], height_ratios=[0.5, 1])
axarr["main"].scatter(pairs[:, 0], pairs[:, 1], alpha=0.5)
axarr["top"].hist(pairs[:, 0], bins=20)
axarr["left"].hist(pairs[:, 0], bins=20, orientation="horizontal")
axarr["left"].sharey(axarr["main"])
axarr["top"].sharex(axarr["main"])
axarr["top"].tick_params(labelbottom=False)
axarr["main"].tick_params(labelleft=False)
ticklabels = axarr["top"].get_yticklabels()
axarr["main"].set_xlabel("x")
axarr["left"].set_ylabel("y")
axarr["left"].set_xlabel("PDF")
axarr["top"].set_ylabel("PDF")

Горизонтальное расстояние между подграфиками больше, чем вертикальное, из-за ограниченного макета, оставляющего место для отметок и меток осей верхнего подграфика. Я хотел бы проигнорировать это и уменьшить горизонтальное расстояние до такого же, что и вертикальное.
Один из подходов, который я попробовал, заключался в том, чтобы установить положение основной оси после, то есть добавив это в конце. кода:
Код: Выделить всё
pos_main = axarr["main"].get_position().transformed(fig.dpi_scale_trans)
pos_top = axarr["top"].get_position().transformed(fig.dpi_scale_trans)
pos_left = axarr["left"].get_position().transformed(fig.dpi_scale_trans)
space = pos_top.ymin - pos_main.ymax
pos_main.update_from_data_x([pos_left.xmax + space, pos_main.xmax])
axarr["main"].set_position(pos_main.transformed(fig.dpi_scale_trans.inverted()))

Как мне сначала применить constrained_layout, затем отключить его и настроить положения осей?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ned-layout
Мобильная версия