Я пытаюсь создать фигуру с четырьмя панелями, где нижняя левая панель содержит диаграмму рассеяния, а остальные три панели содержат гистограммы. В верхнем левом углу будет стандартная гистограмма по x-размеру рассеяния, в нижнем правом углу будет повернутая на 90 ° гистограмма для y-измерения. И то, и другое легко сделать в matplotlib.
У меня проблемы с третьей гистограммой, которая должна быть повернутой на 45 ° в правом верхнем углу рисунка, показывающей распределение различий между точками x и y. Я делал такие фигуры раньше, вручную поворачивая и масштабируя оси в Illustrator, но похоже, что matplotlib должен быть в состоянии создавать фигуры, которые уже вращаются с использованием методов преобразования на осях подзаговоров.
Я подумал, что может сработать что-то вроде следующего:
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
fig, ax = plt.subplots(nrows=2, ncols=2, squeeze=True, sharex=False,
sharey=False, figsize=(8,8))
ax[0,1].text(0.5,0.5,'I should be rotated',ha='center',va='center')
t = ax[0,1].get_transform()
ax[0,1].set_transform(t.transform(Affine2D().rotate_deg(45)))
plt.show()
Здесь я пытаюсь получить преобразование от оси, изменить его, а затем заменить его обратно в объект оси. Этот код не имеет никакого эффекта, однако. Любая помощь будет принята с благодарностью.
Отредактировано на основе предложения от ImportanceOfBeingErnest в комментариях:
Я посмотрел демо-версию «Плавающие оси» и теперь получил следующее:
from matplotlib.transforms import Affine2D
import mpl_toolkits.axisartist.floating_axes as floating_axes
import matplotlib.pyplot as plt
def setup_axes(fig, rect, rotation, axisScale):
tr = Affine2D().scale(axisScale[0], axisScale[1]).rotate_deg(rotation)
grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(-0.5, 3.5, 0, 4))
ax = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)
fig.add_subplot(ax)
aux_ax = ax.get_aux_axes(tr)
return ax, aux_ax
fig = plt.figure(1, figsize=(8, 8))
axes = []
axisOrientation = [0, 0, 270, -45]
axisScale = [[1,1],[2,1],[2,1],[2,1]]
axisPosition = [223,221,224,222]
for i in range(0, len(axisOrientation)):
ax, aux_ax = setup_axes(fig, axisPosition[i], axisOrientation[i], axisScale[i])
axes.append(aux_ax)
fig.subplots_adjust(wspace=-0.2, hspace=-0.2, left=0.00, right=0.99, top=0.99, bottom=0.0)
plt.show()
Это приближает меня к тому, чего я хочу:
Я сделаю попытку добавления графика рассеяния и гистограмм к этим осям.