fornisco una soluzione alla fine, ma prima dico in che modo non porta al successo.
ho rivisitato questo problema di recente, e trascorso molto tempo con provare varie soluzioni, cioè cercando quasi tutte le possibili combinazioni di trasformazioni tra i diversi sistemi di coordinate e la loro relazione con la tight_layout()
. Ho sperimentato solo con backend_pdf
, quindi non posso dire di media interattivi. Ma in breve, la mia conclusione è che non importa come tu cerchi di scoprire le posizioni e provare a trasformarle, non è possibile a questo livello allineare le etichette degli assi. Immagino che in qualche modo dovrebbe essere possibile, per esempio in qualche modo internamente matplotlib è in grado di allineare gli assi delle sottotrame stesse. Solo con il disegno nel file pdf due volte e fare qualcosa di simile sotto inbetween, ho potuto raggiungere posizioni migliori, ma ancora non allineato:
# 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()
)
)
Si tratta di una vergogna come una funzionalità di base non può essere raggiunto, ed è oscura il modo in cui i diversi spazi di coordinate vengono trasformati e riscalati nei diversi passaggi della trama. Gradirei molto vedere una chiara spiegazione di ciò, perché lo matplotlib webpage descrive solo l'architettura, presenta casi semplici, ma non riesce a spiegare situazioni come questa. Inoltre sono sorpreso che i metodi che accettano o restituiscono le coordinate non dicono nella loro docstring quali sono i tipi di coordinate. Finalmente ho trovato molto utile this tutorial.
Soluzione
Alla fine, invece di scherzi con trasformazioni, ho creato nel GridSpec
una riga aggiuntiva di altezza zero e assi invisibili (stesso può essere fatto con una colonna larghezza zero per etichette dell'asse y). Poi ho aggiunto etichette per queste sottotrame, impostando lo verticalalignment
su 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')
quello che vuoi è descritto qui: http://matplotlib.org/faq/howto_faq.html # align-my-ylabels-across-multiple-subplots –