Curso matplotlib - Gráfico de linhas (Anotações)
Em alguns casos é interessante adicionar elementos textuais diretamente no gráfico para melhorar a sua apresentação. Uma informação importante que pode ser adicionada, é o valor de cada ponto.
Neste caso, na forma como o gráfico está desenhado, o leitor tem apenas uma noção da variação da temperatura ao longo do dia, mas a visualização de cada temperatura não esta clara. Temos algumas opções para adicionar estas informações diretamente no gráfico; por enquanto, vamos ver o plt.annotate()
. Através deste método podemos passar o valor contido no eixo y
diretamente sob o ponto do gráfico.
Este elemento, o plt.annotate()
, precisa de pelo menos dois parâmetros: o text
, que recebe o texto (str
) que será anotado; e o xy
, que recebe uma tuple
contendo o par xy das coordenadas do eixo.
Por exemplo, para adicionar a anotação 'minha anotação'
na posição x = 05:00 horas
e y = 30 °C
, é necessário passar o local correspondente às 05:00 (2.5) horas e a temperatura de 30 °C (30):
plt.figure(figsize=(12,6))
plt.plot(horario, temperatura, c='red', linewidth=3.5, zorder=1, alpha=0.5, label='linha de conecção')
plt.scatter(horario, temperatura, marker='s', edgecolors='k', facecolors='g', s=250, linewidths=3.5,
zorder=2, label='dados reais')
plt.legend(bbox_to_anchor=(1.22,1))
plt.xlabel("Horário", labelpad=15)
plt.ylabel("Temperatura (°C)", labelpad=15)
plt.title("Monitoramento da temperatura na cidade de Birigui-SP no dia 13/04/2021", pad=15)
plt.ylim(14,38)
plt.annotate("minha anotação", xy=(2.5,30))
plt.show()
Figura 1 - Gráfico de dispersão com limites com anotações.
De forma análoga, podemos anotar o valor do primeiro ponto do gráfico passando text=str(temperatura[0])
e xy=(0,temperatura[0])
:
plt.figure(figsize=(12,6))
plt.plot(horario, temperatura, c='red', linewidth=3.5, zorder=1, alpha=0.5, label='linha de conecção')
plt.scatter(horario, temperatura, marker='s', edgecolors='k', facecolors='g', s=250, linewidths=3.5,
zorder=2, label='dados reais')
plt.legend(bbox_to_anchor=(1.22,1))
plt.xlabel("Horário", labelpad=15)
plt.ylabel("Temperatura (°C)", labelpad=15)
plt.title("Monitoramento da temperatura na cidade de Birigui-SP no dia 13/04/2021", pad=15)
plt.ylim(14,38)
plt.annotate(str(temperatura[0]), xy=(0,temperatura[0]))
plt.show()
Figura 2 - Gráfico de dispersão com limites com anotações.
Observe que o valor inserido ficou escondido, pois é um número com apenas duas casas e o tamanho do marcador esta grande. Isso aconteceu pois foi passado para xy
exatamente o centro do marcador, e texto e marcador acabaram se sobrepondo.
Uma boa prática para evitar este problema, é passar uma posição um pouco deslocada para a anotação. Por exemplo, para deixar a anotação um pouco acima do marcador, podemos passar o valor de y
um pouco maior do que o valor original:
plt.figure(figsize=(12,6))
plt.plot(horario, temperatura, c='red', linewidth=3.5, zorder=1, alpha=0.5, label='linha de conecção')
plt.scatter(horario, temperatura, marker='s', edgecolors='k', facecolors='g', s=250, linewidths=3.5,
zorder=2, label='dados reais')
plt.legend(bbox_to_anchor=(1.22,1))
plt.xlabel("Horário", labelpad=15)
plt.ylabel("Temperatura (°C)", labelpad=15)
plt.title("Monitoramento da temperatura na cidade de Birigui-SP no dia 13/04/2021", pad=15)
plt.ylim(14,38)
plt.annotate(str(temperatura[0]), xy=(0,temperatura[0]+1))
plt.show()
Figura 3 - Gráfico de dispersão com limites com anotações.
Para deixar o texto mais centralizado, basta passar um valor menor para o primeiro valor da tuple
:
plt.figure(figsize=(12,6))
plt.plot(horario, temperatura, c='red', linewidth=3.5, zorder=1, alpha=0.5, label='linha de conecção')
plt.scatter(horario, temperatura, marker='s', edgecolors='k', facecolors='g', s=250, linewidths=3.5, zorder=2,
label='dados reais')
plt.legend(bbox_to_anchor=(1.22,1))
plt.xlabel("Horário", labelpad=15)
plt.ylabel("Temperatura (°C)", labelpad=15)
plt.title("Monitoramento da temperatura na cidade de Birigui-SP no dia 13/04/2021", pad=15)
plt.ylim(14,38)
plt.annotate(str(temperatura[0]), xy=(0 - 0.12,temperatura[0]+1))
plt.show()
Figura 4 - Gráfico de dispersão com limites com anotações.
Para adicionar anotações em cada ponto é necessário adicionar diversos elementos de plt.annotate()
, um para cada ponto. Uma boa prática é utilizar um loop for
para adicionar uma anotação para cada ponto (mais eficiente):
plt.figure(figsize=(12,6))
plt.plot(horario, temperatura, c='red', linewidth=3.5, zorder=1, alpha=0.5, label='linha de conecção')
plt.scatter(horario, temperatura, marker='s', edgecolors='k', facecolors='g', s=250, linewidths=3.5,
zorder=2, label='dados reais')
plt.legend(bbox_to_anchor=(1.22,1))
plt.xlabel("Horário", labelpad=15)
plt.ylabel("Temperatura (°C)", labelpad=15)
plt.title("Monitoramento da temperatura na cidade de Birigui-SP no dia 13/04/2021", pad=15)
plt.ylim(14,38)
for i in range(len(temperatura)):
plt.annotate(str(temperatura[i]), xy=(i - 0.12,temperatura[i]+1))
plt.show()
Figura 5 - Gráfico de dispersão com limites com anotações.