Observação
Clique aqui para baixar o código de exemplo completo
Demonstração de rotação de texto padrão #
A maneira como o Matplotlib faz o layout de texto por padrão é contra-intuitiva para alguns, então este exemplo foi projetado para torná-lo um pouco mais claro.
O texto é alinhado por sua caixa delimitadora (a caixa retangular que circunda o retângulo de tinta). A ordem das operações é a rotação e depois o alinhamento. Basicamente, o texto é centralizado em sua localização (x, y), girado em torno desse ponto e alinhado de acordo com a caixa delimitadora do texto girado.
Portanto, se você especificar o alinhamento inferior esquerdo, a parte inferior esquerda da caixa delimitadora do texto girado estará na coordenada (x, y) do texto.
Mas uma imagem vale mais que mil palavras!

import matplotlib.pyplot as plt
import numpy as np
def addtext(ax, props):
ax.text(0.5, 0.5, 'text 0', props, rotation=0)
ax.text(1.5, 0.5, 'text 45', props, rotation=45)
ax.text(2.5, 0.5, 'text 135', props, rotation=135)
ax.text(3.5, 0.5, 'text 225', props, rotation=225)
ax.text(4.5, 0.5, 'text -45', props, rotation=-45)
for x in range(0, 5):
ax.scatter(x + 0.5, 0.5, color='r', alpha=0.5)
ax.set_yticks([0, .5, 1])
ax.set_xticks(np.arange(0, 5.1, 0.5))
ax.set_xlim(0, 5)
ax.grid(True)
# the text bounding box
bbox = {'fc': '0.8', 'pad': 0}
fig, axs = plt.subplots(2, 1, sharex=True)
addtext(axs[0], {'ha': 'center', 'va': 'center', 'bbox': bbox})
axs[0].set_ylabel('center / center')
addtext(axs[1], {'ha': 'left', 'va': 'bottom', 'bbox': bbox})
axs[1].set_ylabel('left / bottom')
plt.show()