Eu tenho um enredo onde eu exibir os pontos máximos e mínimos na trama em cores diferentes. Desde o enredo é dinâmica, por vezes, o texto aparece bem em cima das ytick
etiquetas que não parece bom. Eu quero manter os ytick
's, então eu pensei em colocar o texto dentro do enredo.
No entanto meu eixo x é datetime
variável, proporcionando assim a posição x, y que está entre o primeiro e o segundo xtick
é me jogando fora.
Eu tentei a solução aqui , mas a sua para o eixo inteiro.
Com base na documentação Tentei eixo coords (0,0 é inferior esquerda e 1,1 é superior direito) também, mas o problema é que sua difícil chegar a uma posição de pixel apropriada que é dentro e parte superior do linhas horizontais. Além disso eu acho que seria difícil manter desde que os dados muda todos os dias.
Eu gostaria de ficar com coordenadas de dados , pois os dados é dinâmica.
É possível fazê-lo através de coordenadas de dados?
Por favor, use o código a seguir eu preparei para a minha situação -
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
x = ['2020-03-01', '2020-03-02', '2020-03-03', '2020-03-04', '2020-03-05']
y = [1,2,3,4,5.8]
df = pd.DataFrame({'X': x, 'Y': y})
fig, ax = plt.subplots()
sns.lineplot(x='X', y='Y', data=df)
show_point = 5.7
ax.axhline(show_point, ls='dotted')
trans = transforms.blended_transform_factory(ax.get_yticklabels()[0].get_transform(), ax.transData)
ax.text('2020-03-01', show_point, color="red", s=show_point, transform=trans, ha="right", va="bottom")
show_point2 = 1.7
ax.axhline(show_point2, ls='dotted')
trans = transforms.blended_transform_factory(ax.get_yticklabels()[0].get_transform(), ax.transAxes)
ax.text(0.05, 0.15, color="red", s=show_point2, transform=trans, ha="center", va="bottom")
plt.show()
EDIT 1
O que parece que agora (na trama real) - resultado esperado -
Você pode evitar todo o material transformação de eixo enquanto ainda estiver trabalhando em coordenadas de dados se você usar matplotlib.axes.Axes.annotate
, algo como isto
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
x = ['2020-03-01', '2020-03-02', '2020-03-03', '2020-03-04', '2020-03-05']
y = [1,2,3,4,5.8]
df = pd.DataFrame({'X': x, 'Y': y})
fig, ax = plt.subplots()
sns.lineplot(x='X', y='Y', data=df)
show_point = 5.7
ax.axhline(show_point, ls='dotted')
ax.annotate(show_point, [ax.get_xticks()[0], show_point], va='bottom',
ha='right', color='red')
show_point2 = 1.7
ax.axhline(show_point2, ls='dotted')
ax.annotate(show_point2, [ax.get_xticks()[0], show_point2], va='bottom',
ha='right', color='red')
plt.show()
Isto produzirá