文章目录

一、简介

二、安装方法

三、主要功能

3.1 各级别地图

3.1.1 世界地图

3.1.2 国家地图

3.1.3 市级地图

3.2 地图形式

3.3 在地图上标记

3.3.1 普通标记

3.3.2 点击获取经纬度

3.3.3 动态放置标记

3.4 热力图绘制

3.5 密度地图绘制

3.6 自定义地图区域

3.6.1 只绘制边界,不添加数据

3.6.2 绘制边界,添加数据

四、竞品对比与优劣势

五、参考资料

一、简介

想通过 Python 绘制精美的地图?想在地图上自由的设置各种参数?想获得灵活的交互体验?这里就有一款Python 神包满足你:folium。

folium 建立在 Python 生态系统的数据应用能力和 Leaflet.js 库的映射能力之上,在Python中操作数据,然后通过 folium 在 Leaflet 地图中可视化。

folium 相比较于国内百度的 pyecharts 灵活性更强,能够自定义绘制区域,并且展现形式更加多样化。

附:官方文档,官方示例,本文 notebook ,完整代码及数据。

二、安装方法

按照官方的教程即可,如果安装了 conda ,可以直接

conda install -c conda-forge folium

没有安装的话就使用

python3 -m pip install folium

三、主要功能

3.1 各级别地图

folium 显示地图的类为 folium.Map,类的声明如下

class folium.folium.Map(location=None, width='100%', height='100%', left='0%', top='0%', position='relative', tiles='OpenStreetMap', attr=None, min_zoom=0, max_zoom=18, zoom_start=10, min_lat=-90, max_lat=90, min_lon=-180, max_lon=180, max_bounds=False, crs='EPSG3857', control_scale=False, prefer_canvas=False, no_touch=False, disable_3d=False, png_enabled=False, zoom_control=True, **kwargs)

讲几个重要的参数

location 经纬度,list 或者 tuple 格式,顺序为 latitude, longitude

zoom_start 缩放值,默认为 10,值越大比例尺越小,地图放大级别越大

tiles 显示样式,默认*‘OpenStreetMap’*,也就是开启街道显示

crs 地理坐标参考系统,默认为"EPSG3857"

3.1.1 世界地图

import folium

print(folium.__version__)

# define the world map

world_map = folium.Map()

# display world map

world_map

3.1.2 国家地图

# define the national map

national_map = folium.Map(location=[35.3, 100.6], zoom_start=4)

# display national map

national_map

3.1.3 市级地图

其实改变地图显示就是改变显示的经纬度和缩放比例,省级、市级、县级用法雷同,这里举一个市级的例子为例,如北京市:

# define the city map

city_map = folium.Map(location=[39.93, 116.40], zoom_start=10)

# display city map

city_map

显示效果确实是不如百度的。

3.2 地图形式

除了上述正常的地图显示外,folium 还提供了非常丰富的多样化显示,控制显示效果的变量是tiles,样式有OpenStreetMap, Stamen Terrain, Stamen Toner, Mapbox Bright, Mapbox Control Room等等,这里挑选几个比较常见的

# define the city map,tiles='Stamen Toner'

city_map = folium.Map(location=[39.93, 116.40], zoom_start=10, tiles='Stamen Toner')

# display city map

city_map

# define the city map, tiles='Stamen Terrain'

city_map = folium.Map(location=[39.93, 116.40], zoom_start=10, tiles='Stamen Terrain')

# display city map

city_map

3.3 在地图上标记

3.3.1 普通标记

添加普通标记用 Marker

这里可以选择标记的图案。

bj_map = folium.Map(location=[39.93, 115.40], zoom_start=12, tiles='Stamen Terrain')

folium.Marker(

location=[39.95, 115.33],

popup='Mt. Hood Meadows',

icon=folium.Icon(icon='cloud')

).add_to(bj_map)

folium.Marker(

location=[39.96, 115.32],

popup='Timberline Lodge',

icon=folium.Icon(color='green')

).add_to(bj_map)

folium.Marker(

location=[39.93, 115.34],

popup='Some Other Location',

icon=folium.Icon(color='red', icon='info-sign')

).add_to(bj_map)

bj_map

添加圆形标记用 Circle 以及 CircleMarker

bj_map = folium.Map(location=[39.93, 116.40], zoom_start=12, tiles='Stamen Toner')

folium.Circle(

radius=200,

location=[39.92, 116.43],

popup='The Waterfront',

color='crimson',

fill=False,

).add_to(bj_map)

folium.CircleMarker(

location=[39.93, 116.38],

radius=50,

popup='Laurelhurst Park',

color='#3186cc',

fill=True,

fill_color='#3186cc'

).add_to(bj_map)

bj_map

3.3.2 点击获取经纬度

m = folium.Map(location=[46.1991, -122.1889],tiles='Stamen Terrain',zoom_start=13)

m.add_child(folium.LatLngPopup())

m

通过点击鼠标便可以获取点击出的经纬度。

3.3.3 动态放置标记

m = folium.Map(

location=[46.8527, -121.7649],

tiles='Stamen Terrain',

zoom_start=13

)

folium.Marker(

[46.8354, -121.7325],

popup='Camp Muir'

).add_to(m)

m.add_child(folium.ClickForMarker(popup='Waypoint'))

m

3.4 热力图绘制

因为没有实际的经纬度坐标数据,所以这里只能模拟一些位置出来,另外每个位置还需要一个数值作为热力值。

# generated data

import numpy as np

data = (

np.random.normal(size=(100, 3)) *

np.array([[0.1, 0.1, 0.1]]) +

np.array([[40, 116.5, 1]])

).tolist()

data[:3]

数据分布

[[40.04666663299843, 116.59569796477264, 0.9667425547098781],

[39.86836537517533, 116.28201445195315, 0.8708549157348728],

[40.08123232852134, 116.56884585184197, 0.9104952244371285]]

绘制热力图

# HeatMap

from folium.plugins import HeatMap

m = folium.Map([39.93, 116.38], tiles='stamentoner', zoom_start=6)

HeatMap(data).add_to(m)

# m.save(os.path.join('results', 'Heatmap.html'))

m

3.5 密度地图绘制

folium 不仅可以绘制热力图,还可以绘制密度地图,按照经纬度进行举例聚类,然后在地图中显示。

from folium.plugins import MarkerCluster

m = folium.Map([39.93, 116.38], tiles='stamentoner', zoom_start=10)

# create a mark cluster object

marker_cluster = MarkerCluster().add_to(m)

# add data point to the mark cluster

for lat, lng, label in data:

folium.Marker(

location=[lat, lng],

icon=None,

popup=label,

).add_to(marker_cluster)

# add marker_cluster to map

m.add_child(marker_cluster)

3.6 自定义地图区域

folium 一个非常有优势的功能就是自定义区域的绘制了,只要有区域的边界数据,就可以在地图中以多种多样的形式展现出来,这里以 folium 官方的美国地图为例,源数据是一个 .json 文件,里面包含了各个地区(美国各州)的特征(包括边界经纬度列表、简称等),源数据传送门,其数据格式如下:

3.6.1 只绘制边界,不添加数据

如果只要求绘制边界,而不显示边界区域的相关信息,那么这个是比较容易的,代码如下

import json

import requests

# read us-states border

with open("us-states.json") as f:

us_states = json.load(f)

us_map = folium.Map(location=[35.3, -97.6], zoom_start=4)

folium.GeoJson(

us_states,

style_function=lambda feature: {

'fillColor': '#ffff00',

'color': 'black',

'weight': 2,

'dashArray': '5, 5'

}

).add_to(us_map)

#display map

us_map

3.6.2 绘制边界,添加数据

当需要在各个区域填充数据的时候,这个稍微麻烦点,不仅需要各个区域的边界数据,还需要各个区域的显示信息,这里同样也使用官方的美国各州的边界数据为例:

import geopandas as gpd

import pandas as pd

import folium, branca

states = gpd.GeoDataFrame.from_features(us_states, crs=fiona.crs.from_epsg(4326))

states.head()

我们再把收入等数据连接到上表中

abbrs = pd.read_json(open("abbrs.json"))

statesmerge = states.merge(abbrs,how='left', left_on='name', right_on='name')

statesmerge['geometry']=statesmerge.geometry.simplify(.05)

income = pd.read_csv("income.csv", dtype={"fips":str})

income['income-2015']=pd.to_numeric(income['income-2015'], errors='coerce')

income.groupby(by="state")[['state','income-2015']].median().head()

statesmerge['medianincome']=statesmerge.merge(income.groupby(by="state")[['state','income-2015']].median(), how='left', left_on='alpha-2', right_on='state')['income-2015']

statesmerge['change']=statesmerge.merge(income.groupby(by="state")[['state','change']].median(), how='left', left_on='alpha-2', right_on='state')['change']

statesmerge.head()

最终绘制出的来的地图如下:

除此之外,还有很多非常有趣的功能,这里就不一一列举了,感兴趣的可以参考官方的文档。

四、竞品对比与优劣势

国内的竞品为百度的 pyecharts,和 folium 一样都可以实现普通的地图绘制功能,但是具体使用还有较大的区别,具体如下表

功能

pyecharts

folium

备注

世界地图

可以

可以

中文显示

可以

部分可以

folium地图中标尺、文字不能正常显示,但是嵌入地图中的中文可以正常显示

交互性

区(县)级地图

可以

可以

folium需要区(县)边界数据

市级地图

可以

可以

folium需要市边界数据

收费

自定义区域需要购买百度ak

自定义区域功能免费

灵活性

省级地图

可以

可以

folium需要省边界数据

美观度

较好

自定义区域

部分可以

可以

pyecharts需要百度 ak,folium免费

五、参考资料

[1] https://www.zhihu.com/question/33783546

[2] https://pypi.org/project/folium/

[3] https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/

python制作热图folium_Python绘制地图神器folium入门相关推荐

  1. python制作热图folium_Python Folium包可以在热图上绘制标记吗?

    我已经在地图上添加了一个热图,它可以正常工作. 使用另一个数据集,我希望能够在热图上绘制标记. 有可能这样做吗?我读过一些关于图层的文章,但我不确定我会怎么做.在 目前我的代码:df = pd.rea ...

  2. Python绘制地图神器folium介绍及安装使用教程

    之前给大家介绍过多种Python可视化模块,但使用他们进行地理可视化都很简陋. 所以想要绘制更精美的可视化地图?想在地图上自由的设置各种参数?想获得灵活的交互体验? 今天它就来了,Python绘制地图 ...

  3. 这可能是Python里最强的绘制地图神器

    今天给大家介绍一个非常 NB 的Python 库,专门用来绘制地图的,它叫 Folium . 1. Folium简介 Folium是一个基于leaflet.js的Python地图库,其中,Leafle ...

  4. python制作折线图_Python 绘制可视化折线图

    1. 用 Numpy ndarray 作为数据传入 ply 1 2 3 4 5 6 7 8 9 10 11 import numpy as np import matplotlib as mpl im ...

  5. Python绘制地图神器,上手直接开大!

    来源:凹凸数据 之前给大家介绍过多种Python可视化模块,但使用他们进行地理可视化都很简陋. 所以想要绘制更精美的可视化地图?想在地图上自由的设置各种参数?想获得灵活的交互体验? 今天它就来了,Py ...

  6. 46_Pandas,Python,Seaborn热图的生成

    46_Pandas,Python,Seaborn热图的生成 Python 的可视化库 seaborn 可以轻松创建可视化 2D 数据的热图. 使用 seaborn.heatmap() 函数. Pand ...

  7. Pheatmap热图的绘制及如何调整图片

    Pheatmap热图的绘制及如何调整图片 Pheatmap包是R语言绘制热图比较强大的软件包,当然现在也有很多资料介绍这个包的使用,但是今天我写的重点不是如何使用这个包绘制热图,而是如何绘制出更好看的 ...

  8. python多张图片合并拼接,python制作sprite图、雪碧图

    python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...

  9. python图像识别生成矢量图_使用python制作矢量图

    Get一个使用python制作矢量图的新技能: 前言: Matplotlib远比我们想象的强大,而这只是众多python强大的包中的一个,不愧是群英荟萃. 绘图后端我们一般是看不见的,matplotl ...

最新文章

  1. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送
  2. python循环语句打印矩形_Python中使用循环语句打印三角形、菱形
  3. OpenCV使用Orbbec Astra 3D相机
  4. 【案例】爆老师拆解同步网络seo分析思路
  5. 10-对象实例化、内存布局与访问定位
  6. SSR rendering exceeded timeout 3000, fallbacking to CSR for
  7. 白岩松曾说过这样一段话
  8. 目标检测——neck组件的学习笔记
  9. 微信小程序开发的坑---tabBar
  10. php自动tag,帝国cms自动增加TAG关键字教程
  11. Java之常用函数笔记
  12. 工业产品表面缺陷检测方法——综述
  13. XP连接网络计算机未启动服务,网络不存在或尚未启动/以及局域网互访的解决办法...
  14. 批量修改文件夹中文件的后缀名
  15. 元·认知·人机环·渔樵耕读
  16. 解决微星主板点击睡眠后电脑死机
  17. STC51-Keil使用及流水灯设计
  18. git具体作用_Git是什么
  19. MacBook Pro 时间机器备份(完美解决连接移动硬盘无反应)
  20. 关于Ubuntu18.04 Cisco AnyConnect闪退的问题

热门文章

  1. 深度学习新手第一次复现代码的记录
  2. 网络宣传推广的10种好方法
  3. 保安休息排序编程C语言,c语言课程设计保安值班安排系统
  4. 【原创】谈谈34后自己工作的心态
  5. 彩色图像通道分离+融合
  6. android仿微博评论功能,MVC网页中实现类似微博的评论功能
  7. JDK-10.0.2-Windows下载安装
  8. 网路交友9大忌讳 识相点!(转自:Donews)
  9. Scipy误差函数详解
  10. stanley 轨迹跟踪算法