Python/Matplotlib - Как поместить текст в угол равного размера фигуры

Я хотел бы поместить текст в правый нижний угол равного размера фигуры. Я устанавливаю положение относительно фигуры с помощью ax.transAxes, но я должен определить значение относительной координаты вручную в зависимости от шкалы высоты каждого числа.

Что было бы хорошим способом узнать масштаб высоты осей и правильное положение текста в script?

 ax = plt.subplot(2,1,1)
 ax.plot([1,2,3],[1,2,3])
 ax.set_aspect('equal')
 ax.text(1,-0.15, 'text', transform=ax.transAxes, ha='right', fontsize=16)
 print ax.get_position().height

 ax = plt.subplot(2,1,2)
 ax.plot([10,20,30],[1,2,3])
 ax.set_aspect('equal')
 ax.text(1,-0.15, 'text', transform=ax.transAxes, ha='right', fontsize=16)
 print ax.get_position().height                                              

enter image description here

Ответ 1

Используйте annotate.

Фактически, я почти никогда не использовал text. Даже когда я хочу размещать вещи в координатах данных, я обычно хочу компенсировать их некоторым фиксированным расстоянием в точках, что намного проще с помощью annotate.

В качестве быстрого примера:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1))

axes[0].plot(range(1, 4))
axes[1].plot(range(10, 40, 10), range(1, 4))

for ax in axes:
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16,
                horizontalalignment='right', verticalalignment='bottom')
plt.show()

enter image description here

Если вы хотите, чтобы он слегка смещался из угла, вы можете указать смещение через xytext kwarg (и textcoords для управления интерпретацией значений xytext). Я также использую аббревиатуры ha и va для horizontalalignment и verticalalignment здесь:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1))

axes[0].plot(range(1, 4))
axes[1].plot(range(10, 40, 10), range(1, 4))

for ax in axes:
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16,
                xytext=(-5, 5), textcoords='offset points',
                ha='right', va='bottom')
plt.show()

enter image description here

Если вы пытаетесь разместить его под осями, вы можете использовать смещение, чтобы поместить его на заданное расстояние ниже в точках:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1))

axes[0].plot(range(1, 4))
axes[1].plot(range(10, 40, 10), range(1, 4))

for ax in axes:
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16,
                xytext=(0, -15), textcoords='offset points',
                ha='right', va='top')
plt.show()

enter image description here

Также см. Руководство по аннотации Matplotlib для получения дополнительной информации.