tôi cung cấp một giải pháp cuối cùng, nhưng trước tiên tôi nói với cách mà không dẫn đến thành công.
Tôi đã xem lại vấn đề này gần đây và dành nhiều thời gian để thử các giải pháp khác nhau, tức là cố gắng gần như tất cả các kết hợp chuyển đổi giữa các hệ tọa độ khác nhau và mối quan hệ của chúng với tight_layout()
. Tôi đã thử nghiệm chỉ với backend_pdf
, vì vậy tôi không thể nói về phương tiện tương tác. Nhưng một thời gian ngắn, kết luận của tôi là không có vấn đề làm thế nào bạn cố gắng tìm ra các vị trí và cố gắng biến đổi chúng, không thể ở cấp độ này để căn chỉnh các nhãn trục. Tôi đoán bằng cách nào đó nó sẽ là có thể, ví dụ bằng cách nào đó trong nội bộ matplotlib có thể sắp xếp các trục của các subplots mình. Chỉ với vẽ vào file pdf hai lần và làm một cái gì đó như dưới đây Inbetween, tôi có thể đạt được vị trí tốt hơn, nhưng vẫn không thẳng hàng:
# 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()
)
)
Đó là một sự xấu hổ như một chức năng cơ bản không thể đạt được, và nó là che khuất cách các không gian tọa độ khác nhau được chuyển đổi và thay đổi kích thước ở các bước khác nhau của âm mưu. Tôi sẽ đánh giá cao rất nhiều để xem một lời giải thích rõ ràng về điều này, bởi vì các matplotlib webpage chỉ phác thảo kiến trúc, trình bày các trường hợp đơn giản, nhưng không giải thích các tình huống như thế này. Ngoài ra tôi ngạc nhiên rằng phương pháp chấp nhận hoặc trả lại tọa độ không nói trong docstring của họ những loại tọa độ là những người. Cuối cùng tôi thấy rất hữu ích this tutorial.
Giải pháp
Cuối cùng, thay vì can thiệp vào biến đổi, tôi tạo ra trong GridSpec
hàng bổ sung của zero chiều cao và trục vô hình (tương tự có thể được thực hiện với một cột chiều rộng bằng không đối với nhãn trục y). Sau đó, tôi đã thêm nhãn cho các ô con này, đặt verticalalignment
thành 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')
những gì bạn muốn được mô tả ở đây: http://matplotlib.org/faq/howto_faq.html # align-my-ylabels-over-nhiều-subplots –