Como eu poderia plotar o valor dos imóveis?
Como eu poderia plotar o valor dos imóveis?
Oii Nilo, espero que você esteja bem.
Peço desculpas pela demora em obter um retorno.
Plotar o valor de todos os imóveis dificulta a visualização dos valores no mapa, uma vez que possuímos mais de quatro mil dados espalhados e alguns são próximos uns dos outros. Porém, podemos plotar uma amostra desses dados com base em algumas estatísticas, como por exemplo: valores máximos, mínimos e valor médio.
Supondo que iremos plotar os 5 maiores e menores valores e a média. Em código utilizaremos a função sort_values, que por padrão ordena em ordem crescente e a função mean() para a média:
cinco_menores_valores = geo_dados.sort_values(by='Valor')[:5]
cinco_maiores_valores = geo_dados.sort_values(by='Valor', ascending=False)[:5]
preco_medio = geo_dados['Valor'].mean()
Já para a plotagem dos pontos, utilizaremos a função annotate, como mostro abaixo:
base = rj.plot(color='white', edgecolor='black', figsize=(20, 8))
ax = cinco_menores_valores.plot(ax=base, figsize=(20, 8), alpha=1, marker='o', markersize=150)
ax.annotate(text=f"Valor médio: R${preco_medio:,.2f}", xy=(627, 7483.50), ha='center')
cinco_menores_valores.apply(lambda x: ax.annotate(text=f'{x.Valor:,.2f}', xytext=(x - 1.75 for x in x.geometry.centroid.coords[0]), weight='bold', xy=x.geometry.centroid.coords[0], ha='right', arrowprops=dict(arrowstyle='->', color='red')), axis=1)
plt.title("Coordenadas dos apartamentos para vendas na cidade do Rio de Janeiro - valores mínimos", fontsize=14)
plt.xlabel("Longitude", fontsize=14)
plt.ylabel("Latitude", fontsize=14)
plt.show()
Resultado:
Os parâmetros utilizados na função annotate
foram:
text: O texto da anotação
xy: Posição da anotação
ha: Posição do texto, se é esquerda, direita ou centro.
xytext Posição x e y do texto
weight: Tom das letras do texto. "Bold" coloca o texto em negrito.
arrowprops: Para desenhar uma seta no mapa
A título de curiosidade, caso queira verificar outras opções para essa função, recomendo a documentação da biblioteca matplotlib.
Para os os 5 maiores valores, como são próximos uns dos outros, o ajuste das posições do texto é minucioso para que não haja sobrescrita, como mostro abaixo:
base = rj.plot(color='white', edgecolor='black', figsize=(20, 8))
ax = cinco_maiores_valores.plot(ax=base, figsize=(20, 8), alpha=1)
ax.annotate(text=f"Valor médio: R${preco_medio:,.2f}", xy=(627, 7483.50), ha='center')
ax.annotate(text=f'{cinco_maiores_valores["Valor"].iloc[0]:,.2f}', xytext=(x + 5.5 for x in cinco_maiores_valores.iloc[0].geometry.centroid.coords[0]), weight='bold', xy=cinco_maiores_valores.iloc[0].geometry.centroid.coords[0], ha='left', arrowprops=dict(arrowstyle='->', color='red'))
ax.annotate(text=f'{cinco_maiores_valores["Valor"].iloc[1]:,.2f}', xytext=(x - 4 for x in cinco_maiores_valores.iloc[1].geometry.centroid.coords[0]), weight='bold', xy=cinco_maiores_valores.iloc[1].geometry.centroid.coords[0], ha='left', arrowprops=dict(arrowstyle='->', color='red'))
ax.annotate(text=f'{cinco_maiores_valores["Valor"].iloc[2]:,.2f}', xytext=(x - 7 for x in cinco_maiores_valores.iloc[2].geometry.centroid.coords[0]), weight='bold', xy=cinco_maiores_valores.iloc[2].geometry.centroid.coords[0], ha='right', arrowprops=dict(arrowstyle='->', color='red'))
ax.annotate(text=f'{cinco_maiores_valores["Valor"].iloc[3]:,.2f}', xytext=(x + 2 for x in cinco_maiores_valores.iloc[3].geometry.centroid.coords[0]), weight='bold', xy=cinco_maiores_valores.iloc[3].geometry.centroid.coords[0], ha='right', arrowprops=dict(arrowstyle='->', color='red'))
ax.annotate(text=f'{cinco_maiores_valores["Valor"].iloc[4]:,.2f}', xytext=(x + 5 for x in cinco_maiores_valores.iloc[4].geometry.centroid.coords[0]), weight='bold', xy=cinco_maiores_valores.iloc[4].geometry.centroid.coords[0], ha='right', arrowprops=dict(arrowstyle='->', color='red'))
plt.title("Coordenadas dos apartamentos para vendas na cidade do Rio de Janeiro - valores máximos", fontsize=14)
plt.xlabel("Longitude", fontsize=14)
plt.ylabel("Latitude", fontsize=14)
plt.show()
Resultado:
Espero ter ajudado e qualquer dúvida fico a disposição.
Grande abraço e bons estudos!