1
resposta

Plotar o valor do imóvel

Como eu poderia plotar o valor dos imóveis?

1 resposta

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:

Imagem com o fundo branco que contorna o mapa do estado do Rio de Janeiro onde na região central possui maior aglomeração dos menores valores de apartamento, são eles: 80, 84, 80, 80 e 80 mil reais

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:

Imagem com o fundo branco que contorna o mapa do estado do Rio de Janeiro onde na lateral inferior direita possui maior aglomeração dos maiores valores de apartamento, são eles: 21, 19, 16, 30 e 22.500 milhões de reais

Espero ter ajudado e qualquer dúvida fico a disposição.

Grande abraço e bons estudos!