推荐一个超好用的python包folium, 专门用于地理数据可视化,官方英文教程教程点击这里,查看本文源代码请点击这里 imgimg使用方法很简单,操作如下:导入包,创建一副世界地图

import folium
import pandas as pd

# define the world map
world_map = folium.Map()

# display world map
world_map

imgimg2. 输入经纬度,尺度,在这里我们以旧金山(37.7749° N, 122.4194° W)为例。

# San Francisco latitude and longitude values
latitude = 37.77
longitude = -122.42

# Create map and display it
san_map = folium.Map(location=[latitude, longitude], zoom_start=12)

# Display the map of San Francisco
san_map

imgimg更改地图显示,默认为'OpenStreetMap'风格,我们还可以选择'Stamen Terrain', 'Stamen Toner'等。

# Create map and display it
san_map = folium.Map(location=[latitude, longitude], zoom_start=12,tiles='Stamen Toner')

imgimg3. 读取数据集(旧金山犯罪数据集)# Read Dataset cdata = pd.read_csv('https://cocl.us/sanfran_crime_dataset')

`

# Read Dataset 
cdata = pd.read_csv('https://cocl.us/sanfran_crime_dataset')
cdata.head()

imgimg4. 在地图上显示前200条犯罪数据


# get the first 200 crimes in the cdata
limit = 200
data = cdata.iloc[0:limit, :]

# Instantiate a feature group for the incidents in the dataframe
incidents = folium.map.FeatureGroup()

# Loop through the 200 crimes and add each to the incidents feature group
for lat, lng, in zip(cdata.Y, data.X):
  incidents.add_child(
      folium.CircleMarker(
          [lat, lng],
          radius=7, # define how big you want the circle markers to be
          color='yellow',
          fill=True,
          fill_color='red',
          fill_opacity=0.4
      )
  )

# Add incidents to map
san_map = folium.Map(location=[latitude, longitude], zoom_start=12)
san_map.add_child(incidents)

imgimg5. 添加地理标签

# add pop-up text to each marker on the map
latitudes = list(data.Y)
longitudes = list(data.X)
labels = list(data.Category)

for lat, lng, label in zip(latitudes, longitudes, labels):
  folium.Marker([lat, lng], popup=label).add_to(san_map)    
   
# add incidents to map
san_map.add_child(incidents)

imgimg6. 统计区域犯罪总数


from folium import plugins

# let's start again with a clean copy of the map of San Francisco
san_map = folium.Map(location = [latitude, longitude], zoom_start = 12)

# instantiate a mark cluster object for the incidents in the dataframe
incidents = plugins.MarkerCluster().add_to(san_map)

# loop through the dataframe and add each data point to the mark cluster
for lat, lng, label, in zip(data.Y, data.X, cdata.Category):
  folium.Marker(
      location=[lat, lng],
      icon=None,
      popup=label,
  ).add_to(incidents)

# add incidents to map
san_map.add_child(incidents)

imgimg7. 读取geojson文件,可视化旧金山市10个不同Neighborhood的边界

import json
import requests

url = 'https://cocl.us/sanfran_geojson'
san_geo = f'{url}'
san_map = folium.Map(location=[37.77, -122.4], zoom_start=12)
folium.GeoJson(
  san_geo,
  style_function=lambda feature: {
      'fillColor': '#ffff00',
      'color': 'black',
      'weight': 2,
      'dashArray': '5, 5'
  }
).add_to(san_map)

#display map
san_map

imgimg8. 统计每个区域的犯罪事件数目

# Count crime numbers in each neighborhood
disdata = pd.DataFrame(cdata['PdDistrict'].value_counts())
disdata.reset_index(inplace=True)
disdata.rename(columns={'index':'Neighborhood','PdDistrict':'Count'},inplace=True)
disdata

9. 创建Choropleth Map (颜色深浅代表各区犯罪事件数目)

m = folium.Map(location=[37.77, -122.4], zoom_start=12)
folium.Choropleth(
  geo_data=san_geo,
  data=disdata,
  columns=['Neighborhood','Count'],
  key_on='feature.properties.DISTRICT',
  #fill_color='red',
  fill_color='YlOrRd',
  fill_opacity=0.7,
  line_opacity=0.2,
  highlight=True,
  legend_name='Crime Counts in San Francisco'
).add_to(m)
m

imgimg10. 创建热力图

from folium.plugins import HeatMap

# let's start again with a clean copy of the map of San Francisco
san_map = folium.Map(location = [latitude, longitude], zoom_start = 12)

# Convert data format
heatdata = data[['Y','X']].values.tolist()

# add incidents to map
HeatMap(heatdata).add_to(san_map)

san_map

imgimg本文源代码Jupyter notebook地址:Jupyter Notebook Viewer​nbviewer.jupyter.orgGitHub下载地址:gaonanlee/Visualization-Practice​github.com图标最后,folium还可以用来创建动态热力图,动态路径图等,具体可参考Medium上的这篇文章。imgimg我的其他回答哪些 Python 库让你相见恨晚?学习python中的pandas有没有好的教程推荐?机器学习中的因果关系: 从辛普森悖论(常见的统计学谬误)谈起欢迎大家关注我的机器学习笔记专栏,我将用小白也能听懂的语言,为大家讲述机器学习中那些有趣好玩的知识 (●'◡'●)

 

张戎:如何用 PYTHON 绘制漂亮的地图?— FOLIUM 作图工具介绍 Folium 简介作为 Python 的一个可视化工具包 Folium,它通过 Leaflet 的地图服务,可以在 Jupyter Notebook 上实现可视化的地理位置作图,制作各种各样精美的地图信息。它不仅可以针对某个经纬度进行地理位置的可视化操作,还能够根据实时的人群地理位置信息来构建静态与动态热力图,甚至还能够针对经纬度的数量来进行必要的聚类可视化。本文将会基于新加坡的地图,对 Folium 的一些功能做简要的介绍,对此工具有兴趣的读者可以参阅 Folium 的官方文档。创建地图通过 Folium 工具,可以直接作出一张世界地图,其代码也十分地简洁明了。

from folium.plugins import HeatMap

# let's start again with a clean copy of the map of San Francisco
san_map = folium.Map(location = [latitude, longitude], zoom_start = 12)

# Convert data format
heatdata = data[['Y','X']].values.tolist()

# add incidents to map
HeatMap(heatdata).add_to(san_map)

san_map

imgimg世界地图除了能够作出一张完整的世界地图之外,通常程序员最常见的需求是针对某个或者某一些经纬度,来作出一张局部地图。地图中不仅需要包括经纬度信息,也需要有街道信息等必要的内容,甚至需要对经纬度的标记做一些必要的定制化工作。在初始化一张地图的时候,需要指定它的经纬度信息,也就是 location 的位置。也需要根据需要放大的尺寸来指定相应的 zoom_start 值。另外,tiles 是 str 型,用于控制绘图调用的地图样式,默认为'OpenStreetMap',也有一些其他的内建地图样式,如'Stamen Terrain','Stamen Toner'。有的时候需要在地图上标识出相应的经纬度,此时需要使用 folium.Marker 函数。其使用方法就是直接输入相应的经纬度信息,以及 icon 的形状(例如 'cloud', 'info-sign' 等);除此之外,还可以对其颜色进行标记,一般是对参数 color 进行调整即可。另外,在某些经纬度上,还可以使用“点击-弹出“的控件 tooltip 和 popup,一旦鼠标指向该位置,就会呈现出相应的弹出信息。

 

 

 

imgimgFolium 的经纬度作图(OpenStreetMap)imgimgFolium 的经纬度作图(Stamen Terrain)imgimgFolium 的经纬度作图(Stamen Toner)有的时候,我们只知道某个地点,但是并不知道相应的经纬度数据,此时,只需要使用 folium.LatLngPopup() 就可以在鼠标指向位置上呈现相应的经纬度值,可以方便的查阅和使用。

 

点击地图呈现经纬度几何形状在作出关键的经纬度点之后,有的时候我们需要作出相应的几何图形将其显示得更加清楚。Folium 提供线段相连,多边形,圆形,矩形等诸多图形,只需要使用相应的函数即可。

 

 

imgimgFolium 中的画出各种形状热力图在实际使用经纬度信息的时候,通常来说会针对某个 APP 或者多款 APP 的实时经纬度信息来获取路况的拥挤程度,景区的人流量等信息,在这种情况下,就可以做出热力图。通过实时的热力图信息,我们可以获得相应的人流量信息进行必要的数据分析工作。

 

imgimg除了单张图的热力图之外,Folium 还能够计算一段时间的连续热力图信息。

 

连续时间的热力图经纬度点的聚类除了热力图能反映人流量的信息,基于地理位置的聚类算法同样能够反映一个地区的拥挤程度,Folium 的 MarkerCluster() 函数可以对一个区域中的点来做聚类,在地图中可以放大和缩小,从而知道局部最拥挤的点在哪里了,最稀疏的区域是哪里。

 

经纬度的点聚类可视化以上就是关于 Folium 的基础内容,有兴趣的读者可以自行参阅 Folium 的官方文档。参考文献Folium 官方文档:Folium - Folium 0.12.1 documentation

Python地图可视化库有大家熟知的pyecharts、plotly、folium,其他回答都有介绍,还有稍低调的bokeh、basemap、geopandas,也是地图可视化的利器。首先介绍下bokehbokeh擅长制作交互式图表,当然在地图展示方面也毫不逊色。Bokeh支持google地图、geojson数据的地理可视化展示,关键是可以动态交互。imgimgimgimgBokeh官网提供了详细的地图可视化方案,感兴趣的把示例代码拉出来跑一跑。https://docs.bokeh.org/en/latest/docs/user_guide/geo.html basemap是专业的地理信息可视化库 可以毫不夸张的说,basemap是python地图可视化最牛逼的第三方库,没有之一。basemap基于matplotlib开发,所以它具有创建数据可视化的所有功能,必须配合matplotlib使用。只需要几行代码就可以画一张世界地图:

 

imgimg`from

 

imgimg由于basemap无所不能的绘图能力,你还可以画:风勾图imgimg轮廓图imgimg填充轮廓图imgimg伪彩色图imgimg地理标记imgimg矢量场流线图imgimg实景地图imgimgimgimg多子图地图imgimg3D地图imgimg注:评论里提醒,由于basemap支持py2,而py2已经停止维护,所以basemap也被matplotlib放弃了。取而代之的是cartopy ,支持py3,完美结合matplotlib。imgimg最后说说geopandas geopandas,顾名思义是基于pandas的地图可视化工具,所以它对地理数据的处理非常方便。推荐大家将geopandas作为地理信息数据处理的主要工具。之前写过一个geopandas的入门教程,供大家参考:朱卫军:geopandas,用python分析地理空间数据原来这么简单!zhuanlan.zhihu.com图标配合使用matplotlib,很简单的代码就可以画出漂亮的地图:imgimg

posted on 2022-08-11 09:22  root-123  阅读(1014)  评论(0编辑  收藏  举报