Como fazer 3 mapas fáceis com o Python
Ao trabalhar com dados geoespaciais, muitas vezes preciso visualizar esses dados da maneira mais natural possível: um mapa. Não seria legal se pudéssemos usar o Python para criar de forma rápida e fácil mapas interativos de seus dados? Usaremos um conjunto de dados em todos os locais da Starbucks no Condado de Los Angeles para este tutorial. Ao final deste post introdutório, você poderá criar:
- Um mapa básico de pontos de todos os Starbucks do Condado de Los Angeles;
- Um mapa de choropleth que contém códigos postais no Condado de Los Angeles com base em quantos Starbucks estão contidos em cada um deles.
- Um mapa de calor que destaca os "pontos de acesso" da Starbucks no condado de Los Angeles
Vamos fazer isso!
Você precisará de…
- Pacote Pandas Python. Usado para manipular dados facilmente em Python
- Pacote Folium do Python. Usado para criar mapas facilmente
- Uma planilha com latitude/longitude do Starbucks do Condado de LA (no meu GitHub aqui)
- Um GeoJSON (basicamente um json que descreve uma forma complexa) de LA County (aqui) e um GeoJSON de todos os códigos postais no LA County (aqui)
Para se familiarizar com os dados, veja uma imagem das primeiras linhas:
Mapa de Pontos Básico
Criar um mapa básico de pontos de todos os Starbucks no Condado de Los Angeles a partir dos pares de latitude/longitude em nosso dataframe é bastante simples:
#initialize the map around LA County laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9) #add the shape of LA County to the map folium.GeoJson(laArea).add_to(laMap) #for each row in the Starbucks dataset, plot the corresponding latitude and longitude on the map for i,row in df.iterrows(): folium.CircleMarker((row.latitude,row.longitude), radius=3, weight=2, color='red', fill_color='red', fill_opacity=.5).add_to(laMap) #save the map as an html laMap.save('laPointMap.html')
Abra o arquivo laPointMap.html, e nós veremos o seguinte mapa:
Podemos ver claramente todos os Starbucks no condado de Los Angeles como pequenos pontos vermelhos dentro da região do condado de Los Angeles. Claro, você pode personalizar qualquer uma das cores e formas dos pontos.
Mapa coroplético
Eu já conhecia um mapa de coroplético do Tableau e do Power BI, mas acontece que eles são muito úteis na visualização de dados geoespaciais agregados e não me canso de fazê-los com outras ferramentas.
Nosso mapa coroplético responderá a pergunta: "Quais códigos postais no Condado de LA têm mais Starbucks?". O mapa agrega essencialmente cores em cada CEP com base no valor de alguma outra variável, o número de lojas da Starbucks no nosso caso.
Primeiro vamos ler o código básico necessário para criar um:
#group the starbucks dataframe by zip code and count the number of stores in each zip code numStoresSeries = df.groupby('zip').count().id
#initialize an empty dataframe to store this new data numStoresByZip = pd.DataFrame()
#populate the new dataframe with a 'zipcode' column and a 'numStores' column numStoresByZip['zipcode'] = [str(i) for i in numStoresSeries.index] numStoresByZip['numStores'] = numStoresSeries.values #initialize the LA County map laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9) #draw the choropleth map. These are the key components: #--geo_path: the geojson which you want to draw on the map [in our case it is the zipcodes in LA County] #--data: the pandas dataframe which contains the zipcode information # AND the values of the variable you want to plot on the choropleth #--columns: the columns from the dataframe that you want to use #[this should include a geospatial column [zipcode] and a variable [numStores] #--key_on: the common key between one of your columns and an attribute in the geojson. #This is how python knows which dataframe row matches up to which zipcode in the geojson laMap.choropleth(geo_path='laZips.geojson', data=numStoresByZip, columns=['zipcode', 'numStores'], \ key_on='feature.properties.zipcode', fill_color='YlGn', fill_opacity=1) laMap.save('laChoropleth.html')
Como eu pessoalmente achei mais difícil entender como colocar todos os componentes no lugar em um coroplético, vamos dar uma olhada em um visual separado para ver como ele funciona.
O mapa precisa saber qual cor preencher para o CEP 90001, por exemplo. Ele verifica o dataframe do pandas referenciado pelo campo de dados, procura na coluna key_on pelo código postal e localiza a outra coluna listada nas colunas que é numStores. Em seguida, ele sabe que precisa preencher a cor correspondente a 3 lojas no CEP 90001.
Em seguida, ele procura no GeoJSON referenciado pelo campo geo_path e localiza o CEP 90001 e suas informações de forma associadas, que informam a forma a ser desenhada para esse CEP no mapa. Através desses links, ele tem todas as informações necessárias. Vamos ver o mapa resultante em laChoropleth.html!
Mapa de calor
No mapa coroplético acima, vemos que as áreas no sul do condado de Los Angeles parecem ter mais lojas da Starbucks em geral, mas podemos ser um pouco mais específicas? Podemos descobrir onde há muitas lojas da Starbucks em uma pequena vizinhança? Basicamente, vamos criar um mapa de calor para destacar os "pontos de acesso" da Starbucks no Condado de Los Angeles.
#initialize the LA County map laMap = folium.Map(location=[34.0522,-118.2437], tiles='Stamen Toner', zoom_start=9) #add the shape of LA County to the map folium.GeoJson(laArea).add_to(laMap) #for each row in the Starbucks dataset, plot the corresponding latitude and longitude on the map for i,row in df.iterrows(): folium.CircleMarker((row.latitude,row.longitude), radius=3, weight=2, color='red', fill_color='red', fill_opacity=.5).add_to(laMap) #add the heatmap. The core parameters are: #--data: a list of points of the form (latitude, longitude) indicating locations of Starbucks stores #--radius: how big each circle will be around each Starbucks store #--blur: the degree to which the circles blend together in the heatmap laMap.add_children(plugins.HeatMap(data=df[['latitude', 'longitude']].as_matrix(), radius=25, blur=10)) #save the map as an html laMap.save('laHeatmap.html')
Os principais parâmetros no mapa de calor que precisam de algumas tentativas e erros são raio, que controla o tamanho dos círculos ao redor de cada loja Starbucks e o desfoque, que controla o quanto os círculos se "misturam".
Um raio mais alto significa que qualquer Starbucks dado influencia uma área maior e um desfoque mais alto significa que dois Starbucks que estão mais distantes um do outro ainda podem contribuir para um hotspot. Os parâmetros são com você!
Vamos ver uma imagem do nosso mapa de calor em laHeatmap.html.
Hmm ... legal, mas parece que tudo é vermelho. Os heatmaps podem ser mais valiosos se você ampliar o zoom. Vamos ampliar um pouco e ver se conseguimos identificar pontos de acesso mais específicos.
Basicamente é isso, e você pode usar qualquer dado GeoSon ou csv em seu projeto. Meu único arrependimento é que ainda não encontrei uma maneira de incorporar as versões interativas reais desses mapas em uma postagens aqui no blog, por isso só consegui mostrar capturas de tela. Eu recomendo fortemente que você execute os pequenos pedaços de código através deste post para brinar com os mapas interativos por si mesmo. É uma experiência totalmente diferente.
Espero que este post tenha ajudado um pouco e nos vemos no próximo!
Nenhum comentário:
Postar um comentário