前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊一聊我常用的6种绘制地图的方法

聊一聊我常用的6种绘制地图的方法

作者头像
周萝卜
发布于 2021-12-08 12:27:21
发布于 2021-12-08 12:27:21
3.8K00
代码可运行
举报
文章被收录于专栏:萝卜大杂烩萝卜大杂烩
运行总次数:0
代码可运行

今天来讲一讲在日常工作生活中我常用的几种绘制地图的方法,下面我将介绍下面这些可视化库的地图绘制方法,当然绘制漂亮的可视化地图还有很多优秀的类库,没有办法一一列举

pyecharts、plotly、folium、bokeh、basemap、geopandas、cartopy

Boken

首先我们先介绍 Boken 绘制地图的方法

Bokeh 支持创建基本地图可视化和基于处理地理数据的地图可视化

画一张世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from bokeh.plotting import figure, show
from bokeh.tile_providers import CARTODBPOSITRON, get_provider
from bokeh.io import output_notebook


output_notebook()
tile_provider = get_provider(CARTODBPOSITRON)

p = figure(x_range=(-2000000, 6000000), y_range=(-1000000, 7000000),
           x_axis_type="mercator", y_axis_type="mercator")
p.add_tile(tile_provider)

show(p)

再画一张中国地图看看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from bokeh.plotting import curdoc, figure
from bokeh.models import GeoJSONDataSource
from bokeh.io import show

# 读入中国地图数据并传给GeoJSONDataSource
with open("china.json", encoding="utf8") as f:
    geo_source = GeoJSONDataSource(geojson=f.read())
# 设置一张画布
p = figure(width=500, height=500)
# 使用patches函数以及geo_source绘制地图
p.patches(xs='xs', ys='ys', source=geo_source)
show(p)

我们通过 GEO 地理数据来绘制地图同样非常方便,但是地图看起来有一些单调,我们把不同的省份绘制成不同的颜色来看看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open("china.json", encoding="utf8") as f:
    data = json.loads(f.read())
# 判断是不是  北京地区数据
def isBeijing(district):
    if 'beijing' in district['properties']['woe-name'].lower():
        return True
    return False
# data['features'] = list(filter(isInLondon, data['features']))
# 过滤数据
# 为每一个地区增加一个color属性
for i in range(len(data['features'])):
    data['features'][i]['properties']['color'] = ['red', 'blue', 'yellow', 'orange', 'gray', 'purple'][i % 6]
    data['features'][i]['properties']['number'] = random.randint(0, 20_000)
geo_source = GeoJSONDataSource(geojson=json.dumps(data))
p = figure(width=500, height=500, tooltips="@name, number: @number")
p.patches(xs='xs', ys='ys', fill_alpha=0.7,
        line_color='white',
        line_width=0.5,
        color="color",   # 增加颜色属性,这里的"color"对应每个地区的color属性
        source=geo_source)
p.axis.axis_label = None
p.axis.visible = False
p.grid.grid_line_color = None

show(p)

可以看到已经有内味了,唯一美中不足的就是南海的十三段线没有展示出来

geopandas

GeoPandas 是基于 Pandas 的地图可视化工具,其数据结构完全继承自 Pandas,对于熟悉潘大师的同学来说还是非常友好的

还是先画一张世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
%matplotlib inline

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world.plot()
plt.show()

这也是 geopandas 官网上的经典图片,可以看到非常简单,除去 import 代码,仅仅三行,就完成了地图的绘制

下面我们继续绘制中国地图,这次我们加上九段线信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
china_nine = geopandas.read_file(r"geojson/九段线GS(2019)1719号.geojson")
china = geopandas.read_file('china-new.json')
fig, ax = plt.subplots(figsize=(12, 8),dpi=80)
ax = china.plot(ax=ax, column='number')
ax = china_nine.plot(ax=ax)
plt.show()

我们复用了前面处理的 china.json 数据,里面的 number 字段是随机生成的测试数据,效果与 Bokeh 不相上下

plotly

接下来我们介绍 plotly,这也是一个非常好用的 Python 可视化工具,如果要绘制地图信息,我们需要安装如下依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install geopandas==0.3.0
!pip install pyshp==1.2.10
!pip install shapely==1.6.3

接下来我们先绘制一个世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import plotly.graph_objects as go

fig = go.Figure(go.Scattermapbox(
    mode = "markers+lines",
    lon = [10, 20, 30],
    lat = [10, 20,30],
    marker = {'size': 10}))

fig.add_trace(go.Scattermapbox(
    mode = "markers+lines",
    lon = [-50, -60,40],
    lat = [30, 10, -20],
    marker = {'size': 10}))

fig.update_layout(
    margin ={'l':0,'t':0,'b':0,'r':0},
    mapbox = {
        'center': {'lon': 113.65000, 'lat': 34.76667},
        'style': "stamen-terrain",
        'center': {'lon': -20, 'lat': -20},
        'zoom': 1})

fig.show()

这里我们使用底层 API plotly.graph_objects.Choroplethmapbox 来绘制

下面我们继续绘制中国地图,使用一个高级 API plotly.express.choropleth_mapbox

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import plotly.express as px
import numpy as np
import json

with open(r"china_province.geojson", encoding='utf8') as f:
    provinces_map = json.load(f)

df = pd.read_csv(r'data.csv')
df.确诊 = df.确诊.map(np.log)

fig = px.choropleth_mapbox(
    df,
    geojson=provinces_map,
    color='确诊',
    locations="地区",
    featureidkey="properties.NL_NAME_1",
    mapbox_style="carto-darkmatter",
    color_continuous_scale='viridis',
    center={"lat": 37.110573, "lon": 106.493924},
    zoom=3,
)
fig.show()

可以看出绘制出的交互式地图还是非常漂亮的,不过渲染速度有些感人,这个就看个人的需求了,如果你对渲染速度有要求,那么 Ployly 可能不是最好的选择~

Cartopy/Basemap

之所以把这两个库放到一起,是因为他们都是基于 Matplotlib 之上的,而随着 Python2 的不再维护,Basemap 也被 Matplotlib 放弃,Cartopy 随之转正,下面我们主要介绍 Cartopy 工具

Cartopy 利用了强大的 PROJ.4、NumPy 和 Shapely 库,并在 Matplotlib 之上构建了一个编程接口,用于创建发布高质量的地图

先来绘制一个世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%matplotlib inline
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()

plt.show()

这是一个 cartopy 绘制的非常经典且常见的世界地图,形式比较简单,下面我们增强该地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datetime
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.feature.nightshade import Nightshade


fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())

date = datetime.datetime(2021, 12, 2, 21)

ax.set_title(f'Night time shading for {date}')
ax.stock_img()
ax.add_feature(Nightshade(date, alpha=0.2))
plt.show()

我们通过上面的代码,绘制了当前时间世界昼夜图,还是很强的

下面我们继续绘制中国地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cartopy.io.shapereader as shpreader
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.io.shapereader as shapereader
import matplotlib.ticker as mticker
#从文件中加载中国区域shp
shpfile = shapereader.Reader(r'ne_10m_admin_0_countries_chn\ne_10m_admin_0_countries_chn.shp')
# 设置 figure 大小
fig = plt.figure(figsize=[8, 5.5])
# 设置投影方式并绘制主图
ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180))
ax.add_geometries(
        shpfile.geometries(),
        ccrs.PlateCarree())
ax.set_extent([70, 140, 0, 55],crs=ccrs.PlateCarree())
plt.show()

使用 cartopy 绘制地图最大的特点就是灵活度高,那么相对应的代价就是编写代码也会更难一些,比如如果想要给不同省份填充不同颜色,我们需要编写的代码就有点多

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import shapely.geometry as sgeom

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader

font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) 

def sample_data():
#    lons = [110, 115, 120, 122, 124 ]
    lons = [124, 122, 120, 115, 110 ]
    lats = [33, 32, 28, 30, 28 ]
    return lons, lats

#ax = plt.axes([0, 0, 1, 1], projection=ccrs.LambertConformal())
ax = plt.axes(projection=ccrs.PlateCarree())


ax.set_extent([70, 140, 0, 55],crs=ccrs.Geodetic())

shapename = 'admin_1_states_provinces'
states_shp = shpreader.natural_earth(resolution='10m', category='cultural', name=shapename)


lons, lats = sample_data()

# to get the effect of having just the states without a map "background"
# turn off the outline and background patches
ax.background_patch.set_visible(False)
ax.outline_patch.set_visible(False)

plt.title(u'China Province Level', fontproperties=font)

# turn the lons and lats into a shapely LineString
track = sgeom.LineString(zip(lons, lats))

track_buffer = track.buffer(1)

for state in shpreader.Reader(states_shp).geometries():
    # pick a default color for the land with a black outline,
    # this will change if the storm intersects with our track
    facecolor = [0.9375, 0.9375, 0.859375]
    edgecolor = 'black'

    if state.intersects(track):
        facecolor = 'red'
    elif state.intersects(track_buffer):
        facecolor = '#FF7E00'

    ax.add_geometries([state], ccrs.PlateCarree(),
                      facecolor=facecolor, edgecolor=edgecolor)


# make two proxy artists to add to a legend
direct_hit = mpatches.Rectangle((0, 0), 1, 1, facecolor="red")
within_2_deg = mpatches.Rectangle((0, 0), 1, 1, facecolor="#FF7E00")
labels = [u'省份level1',
          '省份level2']
plt.legend([direct_hit, within_2_deg], labels,
           loc='lower left', bbox_to_anchor=(0.025, -0.1), fancybox=True, prop=font)
ax.figure.set_size_inches(14, 9)
plt.show()

folium

folium 是建立在 Python 生态系统的数据应用能力和 Leaflet.js 库的映射能力之上的高级地图绘制工具,通过 Python 操作数据,然后在 Leaflet 地图中可视化,可以灵活的自定义绘制区域,并且展现形式更加多样化

首先是三行代码绘制世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import folium


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

接下来绘制中国地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 绘制边界
import json

df = pd.read_csv(r'plotly-choropleth-mapbox-demo-master/data.csv')
# read china border 
with open(r"plotly-choropleth-mapbox-demo-master/china_province.geojson", encoding='utf8') as f:
    china = json.load(f)

chn_map = folium.Map(location=[40, 100], zoom_start=4)


folium.Choropleth(
    geo_data=china,
    name="choropleth",
    data=df,
    columns=["地区", "确诊"],
    key_on="properties.NL_NAME_1",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="新冠确诊",
).add_to(chn_map)

folium.LayerControl().add_to(chn_map)

chn_map

作为专业地图工具,不仅渲染速度快,自定义程度也是非常高的,值得使用尝试

PyEcharts

最后我们介绍 PyEcharts,这款国产的精良可视化工具

绘制世界地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker


c = (
    Map()
    .add("测试数据", [list(z) for z in zip(Faker.country, Faker.values())], "world")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-世界地图"),
        visualmap_opts=opts.VisualMapOpts(max_=200),
    )
)
c.render_notebook()

通过 Pyecharts 绘制地图的一个好处就是不需要处理 GEO 文件,我们直接出入国家名称,就可以自动匹配到地图上,非常方便

再绘制中国地图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = (
    Map()
    .add("测试数据", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-VisualMap(中国)"),
        visualmap_opts=opts.VisualMapOpts(max_=200, is_piecewise=True),
    )
)
c.render_notebook()

我们只需要把参数替换成 ”china“ 就可方便的绘制中国地图,真的很给力,当然对于 Pyecharts 还有很多种玩法,就不一一介绍了

综合上面的示例,我们可以看出, Pyecharts 绘制地图最为简单,非常适合新手学习使用;而 foliumcartopy 则胜在自由度上,它们作为专业的地图工具,留给了使用者无限可能;至于 Plotly Bokeh 则属于更高级的可视化工具,它们胜在画质更加优美,API 调用也更加完善

今天我们介绍了几种比较常用的绘制地图的类库,每一个工具都有其优缺点,我们只需要在选择的时候,明确目标,用心探索就好!

参考:https://gitee.com/kevinqqnj/cartopy_trial/blob/master/cartopy_province.py https://zhuanlan.zhihu.com/p/112324234

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜大杂烩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python常用的6种绘制地图的方法
今天来讲一讲在日常工作生活中我常用的几种绘制地图的方法,下面我将介绍下面这些可视化库的地图绘制方法,当然绘制漂亮的可视化地图还有很多优秀的类库,没有办法一一列举
程序员小二
2021/12/29
6.8K0
Python常用的6种绘制地图的方法
地图(六)利用python绘制连接地图
以上利用cartopy结合matplotlib快速绘制变形地图,也可通过pyecharts绘制漂亮的航班线。
HsuHeinrich
2025/03/18
1470
地图(六)利用python绘制连接地图
如何用Python绘制炫酷的立体地形图
众所周知,Python的matplotlib是一个非常全面的制图库,它不仅可以绘制图表、地图,还可以绘制3D效果图,试想一下,如果你在画图的时候,可以将立体地形图作为底图,那逼格噌一下子就上来了,今天我就来教大家画一个立体地形图,啥也不说,咱先上效果图:
自学气象人
2023/06/21
1.1K1
如何用Python绘制炫酷的立体地形图
台风路径可视化 | 强台风“天兔”移动轨迹图(Chiikawa版)
大家好!最近,2024年第25号台风天兔引起了网友们的广泛关注,因为它有一个特别的名字——“ウサギ”(Usagi),直译过来就是“兔子”。其本义是指天兔星座。 由于这个名字与《Chiikawa》漫画中的可爱角色“乌萨奇”(Usagi)同名,网友们亲切地称其为“乌萨奇台风”。这不仅增加了台风话题的趣味性,也让许多人对这次台风产生了更多的关注。
用户11172986
2024/11/25
4860
台风路径可视化 | 强台风“天兔”移动轨迹图(Chiikawa版)
利用python绘制EC数据全国降水图
Python的绘图功能非常强大,在大气和海洋常常用来绘制一些有关地理方面的图。本片主要介绍python绘制EC数据(grib格式)的的全国降水分布图。
郭好奇同学
2021/11/10
6.4K9
利用python绘制EC数据全国降水图
Python绘制地图专用库(Cartopy)
地图绘制 大家在绘制栅格地图的时候有可能还在使用ArcGIS进行出图,但是ArcGIS出图比较慢,而且批量出图的时候又比较麻烦。 今天给大家介绍一个Python中用于地图绘制的库,Cartopy,这个库跟basemap非常相似,不过basemap现在已经不再更新。所以大家使用Python绘制地图还是使用Cartopy比较好。 Cartopy简介 Cartopy是一个Python软件包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。 网址:https://scitools.org.uk/carto
GIS与遥感开发平台
2022/04/29
2.7K0
Python绘制地图专用库(Cartopy)
气象绘图——白化杂谈
什么是白化?我在一年前也是头一次接触到这个词语,其实就是将你不需要的部分的等值线、等值线填色、风场、流场等挖去。目前气象领域流行的是花式利用地图shp文件进行操作,达到白化的目的。
自学气象人
2023/06/21
1.3K0
气象绘图——白化杂谈
捍卫祖国领土从每一张地图开始
地图是表达国家版图最常用、最主要的形式。但在影视剧《亲爱的,热爱的》中出现了明显的错误,从上至下引起了极大的关注度。
MeteoAI
2019/08/09
6.1K2
捍卫祖国领土从每一张地图开始
地图(八)利用python绘制散点地图
2. 基于pyecharts的涟漪散点地图(Effect Scatter Map)
HsuHeinrich
2025/04/01
1910
地图(八)利用python绘制散点地图
Python绘制气象实用地图(附代码和测试数据)
前面的推文对于常用的Python绘图工具都有了一些介绍,在这里就不赘述了。本文主要就以下几个方面:“中国区域绘图”、“包含南海”、“兰伯特投影带经纬度标签”、“基于salem的mask方法”、“进阶中国区域mask方法”、“进阶省份mask方法”。对日常的实用需求能够在一定程度上满足。后续就Python在气象常用的统计方法(显著性检验)、合成分析、多变量叠加绘图再进行推送,敬请期待!
MeteoAI
2019/08/12
16.2K3
Python绘制气象实用地图(附代码和测试数据)
Python气象绘图教程(十三)—Cartopy_4
本节提要:关于子图的一些问题、使用path添加示意框线、Cartopy台风实例本土化
气象学家
2020/06/17
9.9K2
Python气象绘图教程(十三)—Cartopy_4
常见地图白化方法(二)
地图白化是一种绘制地图的技术,它可以实现对感兴趣区域以外的数据进行遮盖或填充白色的效果,从而突出显示目标区域的特征。 地图白化的原理是利用 shapefile 文件中的多边形坐标来创建一个剪切路径,然后将这个路径应用到 matplotlib 的绘图对象上,使得只有路径内的数据可见,路径外的数据被隐藏或覆盖。 气象家园的另一个五星上将clarmy在龙场悟道后开发了cnmaps库,解决广大地学学子绘制地图的痛点
用户11172986
2024/06/20
1790
常见地图白化方法(二)
数据处理与可视化 | 站点插值格点+空间区域掩膜
前两天写了插值+空间掩膜的推文,不过因为数据问题删除了。 后台很多朋友留言说有需要,还是想学习一下,因此自己造了个数据再把这篇文章推一遍。
MeteoAI
2021/02/07
2.4K1
地图(一)利用python绘制背景地图
以上基于geopandas获取地图数据,并利用geoplot、cartopy快速绘背景地图。
HsuHeinrich
2025/02/10
1920
地图(一)利用python绘制背景地图
气象常用库 | cartopy常用用法总结
10.在上一题基础上,添加国境线,并指定线宽为0.1(不推荐使用,因为该默认参数会使得我国部分领土丢失)
自学气象人
2022/11/14
1.6K0
气象常用库 | cartopy常用用法总结
python可视化 | 地理桑基图的绘制方法
我回答目前常用的库包不能直接绘制这样的桑基图,我错了,应该回答是目前常用的库包不能绘制这样漂亮些的桑基图。
郭好奇同学
2021/05/28
1.8K0
python可视化 | 地理桑基图的绘制方法
Python兰伯特投影中国区域等值线图(含南海小地图)
自定义兰伯特投影: 原作者:“坎坷”大佬 PlateCarree (无坐标转换)作图: 代码调试作者:气象水文科研猫 注:因小编时间有限,代码未进行精简。 import numpy as np i
bugsuse
2021/01/04
7.7K1
Python兰伯特投影中国区域等值线图(含南海小地图)
Python空间绘图--Cartopy简介
在前面的教程中,我们已经讲解了常用的二维型数据的可视化方法。但是在日常研究中,由于大气科学属于地学系统,和地球地理信息的结合十分密切,大多数时间,需要在图形中添加地理信息。作为胶水语言,在Python中,目前还在使用的地理可视化库包尚有basemap、cartopy、geopandas等,但由于basemap是基于Python 2,而2已经不再维护,这意味着basemap也要为Python 2陪葬。而geopandas是基于pandas的,属于商务图表利器,但对于气象科研,显得力不从心。现在仅介绍basemap接班者cartopy。
DataCharm
2021/02/22
3.4K0
Python空间绘图--Cartopy简介
常见地图白化方法(一)
地图白化是一种绘制地图的技术,它可以实现对感兴趣区域以外的数据进行遮盖或填充白色的效果,从而突出显示目标区域的特征。 地图白化的原理是利用 shapefile 文件中的多边形坐标来创建一个剪切路径,然后将这个路径应用到 matplotlib 的绘图对象上,使得只有路径内的数据可见,路径外的数据被隐藏或覆盖。 气象家园的五星上将兰溪之水说过,其实所谓的“白化”一般就两种途径:①mask数据;②mask图形
用户11172986
2024/06/20
2310
常见地图白化方法(一)
两种micaps站点数据的简单绘制方法
用户11172986
2024/06/20
4100
两种micaps站点数据的简单绘制方法
相关推荐
Python常用的6种绘制地图的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档