Quando adiciono um rótulo de texto vertical a um seaborn
gráfico de barras, os rótulos são deslocados para a esquerda do centro, assim:
Como posso deslocar os rótulos um pouco para a direita para que fiquem bem centralizados?
MWE:
import matplotlib.pyplot as plt
import seaborn as sns
percentages = [8.46950845e+00, 1.58712232e+01, 2.13963086e+01, 2.33865318e+01, 2.04539820e+01, 1.41358888e+01, 7.79622697e+00, 3.49245775e+00, 1.28729140e+00, 3.91327891e-01, 9.80073446e-02, 2.02461563e-02, 3.46222120e-03, 4.92413036e-04, 5.82500571e-05, 5.70562340e-06, 4.59952409e-07, 3.05322729e-08, 1.57123083e-09, 4.80936609e-11]
plt.figure(figsize=(9, 5), dpi=100)
ax = sns.barplot(
x = range(1, len(percentages) + 1),
y = percentages,
legend=False,
hue = range(1, len(percentages) + 1),
palette="GnBu_d"
)
plt.text(0, percentages[0]/2, "Additive", ha="center", va="center", rotation=90, fontsize=10, weight="bold")
plt.text(1, percentages[1]/2, "Additive x Additive", ha="center", va="center", rotation=90, weight="bold")
plt.show()
Seu texto está centralizado corretamente, porém você só usa letras que estão acima da linha de base, o que faz com que pareça que ele não está centralizado.
Veja aqui uma descrição dos modos de alinhamento do matplotlib:
Então o que você está procurando é
va='center_baseline'
, e isso funciona bem em texto/barras horizontais sem rotação:Infelizmente, isso não é suportado em
ha
, mesmo comrotation=90
.Uma opção seria adicionar manualmente um pequeno deslocamento, que dependerá das dimensões da figura:
Exemplo:
Observe como o vermelho
bdpdjy
está corretamente centralizado, mas não o azul com deslocamento manual.As barras nos gráficos de barras do mar são centralizadas nas posições inteiras 1, 2, 3, não em 0, 1, 2. O que podemos fazer é encontrar as posições centrais reais das barras usando
p.get_x() + p.get_width()/2
cada pedaço no gráfico e, então, usar essas coordenadas para o posicionamento do texto.