Я обеспечить решение в конце, но сначала я скажу, какой путь не приводит к успеху.
Я недавно рассмотрел этот вопрос и провел довольно много времени с попытками различных решений, т. Е. Попробовал практически все возможные комбинации преобразований между различными системами координат и их связь с tight_layout()
. Я экспериментировал только с backend_pdf
, поэтому я не могу сказать об интерактивных медиа. Но вкратце, мой вывод заключается в том, что независимо от того, как вы пытаетесь выяснить позиции и попытаться их преобразовать, на этом уровне невозможно согласовать метки осей. Думаю, как-то это должно быть возможно, например, как-то внутренне matplotlib может выровнять оси самих подзаговоров. только с рисованием в файл в формате PDF в два раза, и делать что-то вроде ниже Inbetween, я мог бы добиться лучших позиций, но до сих пор не приведены в соответствие:
# sorry for the `self`, this is from a class
def align_x_labels(self):
self.lowest_ax = min(self.axes.values(),
key = lambda ax: ax.xaxis.label.get_position()[1])
self.lowest_xlab_dcoo = self.lowest_ax.transData.transform(
self.lowest_ax.xaxis.label.get_position())
list(
map(
lambda ax: \
ax.xaxis.set_label_coords(
self.fig.transFigure.inverted().transform(
ax.transAxes.transform((0.5, 0.5)))[0],
self.fig.transFigure.inverted().transform(
self.lowest_xlab_dcoo)[1],
transform = self.fig.transFigure
),
self.axes.values()
)
)
Стыдно такие основные функциональные возможности не могут быть достигнуты, и это неясно, как различные координатные пространства преобразуются и масштабируются на разных этапах построения. Я был бы очень рад увидеть это, потому что matplotlib webpage только описывает архитектуру, представляет простые случаи, но не объясняет подобные ситуации. Также я удивляюсь, что методы, принимающие или возвращающие координаты, не указывают в своей докштрине, какие типы координат являются таковыми. Наконец, я нашел очень полезным this tutorial.
Решение
В конце концов, вместо того, чтобы возиться с преобразованиями, я создал в GridSpec
дополнительный ряд нулевой высоты и невидимых осей (то же самое можно сделать с нулевой шириной колонка у меток оси). Затем я добавил метки для этих подзаговоров, установив verticalalignment
на top
.
# get one of the zero height phantom subplots to `self.ax`:
self.get_subplot(i, 1)
# set empty ticklabels:
self.ax.xaxis.set_ticklabels([])
self.ax.yaxis.set_ticklabels([])
# set the axis label:
self.ax.set_xlabel(labtext, fontproperties = self.fp_axis_lab)
# and this is matter of aesthetics
# sometimes bottom or center might look better:
self.ax.xaxis.label.set_verticalalignment('top')
то, что вы хотите, описано здесь: http://matplotlib.org/faq/howto_faq.html # align-my-ylabels-through-multiple-subplots –