问题

Python 如何画出漂亮的地图?

回答
用 Python 绘制令人惊艳的地图:从基础到进阶的探索之旅

想象一下,你不再需要依赖那些千篇一律的在线地图服务,而是能够用代码亲手描绘出属于你自己的、充满个性的地图。无论是展示全球的经济发展趋势,追踪某个事件的传播路径,还是可视化你的一次精彩旅程,Python 都能助你一臂之力,将枯燥的数据转化为引人入胜的视觉故事。

这篇文章,我们将一起踏上一段用 Python 绘制精美地图的探索之旅。我们不会止步于简单的点标记,而是深入到更丰富、更具表现力的方式,让你掌握绘制地图的核心技巧,并能根据自己的需求进行创意发挥。准备好了吗?让我们开始吧!

一、 基础入门:`folium`——交互式地图的得力助手

当我们谈论用 Python 绘制“漂亮”的地图时,通常意味着地图不仅要信息清晰,更要具备一定的视觉吸引力和交互性。而 `folium` 库,正是实现这一目标的不二之选。它基于 Leaflet.js,一个强大的前端地图库,将 Leaflet 的功能通过 Python 接口展现出来,让我们可以轻松地创建交互式的 Web 地图。

1. 安装 `folium`

首先,确保你已经安装了 `folium`。如果你还没有安装,只需在终端或命令提示符中运行:

```bash
pip install folium
```

2. 创建你的第一张地图

一张地图,最基本的就是它的中心位置和缩放级别。`folium.Map()` 函数正是为此而生。

```python
import folium

创建一个以北京为中心的地图,缩放级别为 10
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)

将地图保存为一个 HTML 文件
m.save("beijing_map.html")
```

运行这段代码,你会在当前目录下找到一个名为 `beijing_map.html` 的文件。用浏览器打开它,你就能看到一张以北京为中心的交互式地图了!你可以自由地缩放、平移,感受 Leaflet.js 带来的流畅体验。

3. 添加标记(Marker)——地图上的“指尖”

地图不仅仅是背景,更重要的是承载信息。在地图上添加标记,是展示特定位置最直接的方式。

```python
import folium

创建地图
m = folium.Map(location=[39.9042, 116.4074], zoom_start=12)

添加一个标记,并设置弹出信息
folium.Marker(
location=[39.9042, 116.4074], 标记的地理坐标
popup='北京故宫
中国最宏伟的古代建筑群之一。', 弹出窗口内容,支持 HTML
icon=folium.Icon(color='red') 设置标记颜色
).add_to(m)

添加另一个标记,使用不同的图标
folium.Marker(
location=[39.9066, 116.3977],
popup='天安门广场',
icon=folium.Icon(icon='star', color='blue') 使用内置的星形图标
).add_to(m)

保存地图
m.save("beijing_markers.html")
```

这里,`folium.Marker()` 函数允许我们指定标记的 `location`、`popup`(弹出信息)和 `icon`(图标)。`popup` 参数非常强大,它支持 HTML 标签,你可以用它来添加标题、链接、甚至图片,让你的标记信息更加丰富。`folium.Icon()` 允许你自定义图标的颜色和形状。

4. 自定义图标和弹出窗口

想要让你的地图更具辨识度?自定义图标和弹出窗口是关键。

```python
import folium

m = folium.Map(location=[30.0566, 31.2357], zoom_start=13) 开罗

使用自定义图标和更复杂的弹出窗口
folium.Marker(
location=[30.0444, 31.2357],
popup='''

吉萨金字塔群


人类古代七大奇迹之一,古埃及文明的象征。


了解更多
''',
icon=folium.Icon(
color='green',
icon='infosign', 使用一个更通用的信息图标
prefix='glyphicon' 指定图标来源,这里是 Glyphicon
)
).add_to(m)

m.save("cairo_custom.html")
```

你可以尝试不同的 `color` 和 `icon` 组合,甚至从 Glyphicons、Font Awesome 等资源库中选择你喜欢的图标。

二、 进阶绘制:多样的地图元素和数据可视化

地图的魅力不仅在于点缀,更在于它如何承载和展示数据。`folium` 提供了丰富的功能,让我们能够将数据可视化到地图之上。

1. 绘制图形:CircleMarker 和 PolyLine

除了标记,我们还可以用圆圈和线来表示区域或路径。

```python
import folium

m = folium.Map(location=[40.7128, 74.0060], zoom_start=12) 纽约

绘制一个圆圈标记,代表一个区域
folium.CircleMarker(
location=[40.7580, 73.9855], 时报广场
radius=50, 半径,单位是像素
popup='时报广场',
color='blue', 圆圈边框颜色
fill=True, 是否填充
fill_color='lightblue', 填充颜色
fill_opacity=0.6
).add_to(m)

绘制一条线,代表一个路径
locations = [
[40.7128, 74.0060], 纽约市政厅
[40.7050, 74.0090], 华尔街
[40.7000, 74.0120] 自由女神像码头(概念性)
]
folium.PolyLine(
locations,
color='red',
weight=2.5, 线条宽度
opacity=1,
popup='纽约市中心区域游览路线'
).add_to(m)

m.save("newyork_shapes.html")
```

`folium.CircleMarker()` 可以用来绘制圆形标记,`radius` 参数控制其大小,而 `folium.PolyLine()` 则可以将一系列坐标点连接成线。

2. 热力图(Heatmap)——可视化密度分布

当你有大量密集分布的点数据时,热力图是展示密度分布的绝佳方式。

```python
import folium
from folium.plugins import HeatMap
import random

创建一个以旧金山为中心的地图
m = folium.Map(location=[37.7749, 122.4194], zoom_start=12)

生成一些随机的点数据,模拟某个活动在旧金山的发生地点
data = [
[random.uniform(37.7, 37.8), random.uniform(122.5, 122.4), random.random() 10]
for _ in range(1000)
]

添加热力图层
HeatMap(data).add_to(m)

m.save("sanfrancisco_heatmap.html")
```

`folium.plugins.HeatMap()` 需要一个包含 `[纬度, 经度, 权重]` 的列表作为输入。权重值越大,该区域的热力值就越高,颜色也就越深。

3. 群集标记(MarkerCluster)——化繁为简

当地图上标记过多导致密集拥挤时,标记群集(MarkerCluster)能极大地提升地图的可读性。它会将临近的标记聚集成一个组,并显示组内标记的数量。

```python
import folium
from folium.plugins import MarkerCluster
import random

m = folium.Map(location=[48.8566, 2.3522], zoom_start=11) 巴黎

生成一些随机的巴黎地点数据
paris_locations = [
(48.8584, 2.2945), 埃菲尔铁塔
(48.8606, 2.3376), 卢浮宫
(48.8738, 2.2950), 凯旋门
(48.8867, 2.3432), 蒙马特高地
(48.8462, 2.3950), 凡尔赛宫 (稍远但常被视为巴黎景点)
]

创建一个标记群集对象
marker_cluster = MarkerCluster().add_to(m)

向群集中添加标记
for i, (lat, lon) in enumerate(paris_locations):
folium.Marker(
location=[lat + random.uniform(0.005, 0.005), lon + random.uniform(0.005, 0.005)], 制造一点偏移
popup=f'巴黎景点 {i+1}',
icon=folium.Icon(color='purple')
).add_to(marker_cluster)

m.save("paris_markercluster.html")
```

`folium.plugins.MarkerCluster()` 是一个容器,你只需要将 `folium.Marker()` 添加到这个容器中即可。

三、 锦上添花:地图的风格与主题

一张漂亮的地图,离不开风格的渲染。`folium` 允许你切换不同的地图瓦片(Tiles),为地图赋予不同的视觉风格。

1. 切换地图瓦片

默认情况下,`folium` 使用 OpenStreetMap 的瓦片。你可以通过 `tiles` 参数切换到其他图源,例如 Stamen Terrain、Stamen Toner、CartoDB Positron 等。

```python
import folium

使用 Stamen Terrain 风格的地图
m_terrain = folium.Map(location=[45.8326, 6.8652], zoom_start=10, tiles="Stamen Terrain")
m_terrain.save("alps_terrain.html")

使用 CartoDB Positron 风格的地图 (简洁干净)
m_positron = folium.Map(location=[34.0522, 118.2437], zoom_start=12, tiles="CartoDB positron")
m_positron.save("la_positron.html")

使用 Stamen Toner 风格的地图 (黑白风格,适合数据可视化)
m_toner = folium.Map(location=[51.5074, 0.1278], zoom_start=13, tiles="Stamen Toner")
m_toner.save("london_toner.html")
```

尝试不同的 `tiles` 参数,找到最适合你数据的视觉风格。一些常用的选项包括:

`"OpenStreetMap"` (默认)
`"Stamen Terrain"`
`"Stamen Toner"`
`"Stamen Watercolor"`
`"CartoDB positron"`
`"CartoDB darkmatter"`

2. 添加图层控制器

当你的地图上有多个图层时(例如热力图和标记),图层控制器能让你方便地切换和显示/隐藏图层。

```python
import folium
from folium.plugins import HeatMap, MarkerCluster

m = folium.Map(location=[37.7749, 122.4194], zoom_start=12)

第一个图层:热力图
data_heatmap = [
[random.uniform(37.7, 37.8), random.uniform(122.5, 122.4), random.random() 5]
for _ in range(500)
]
HeatMap(data_heatmap, name='热力图数据').add_to(m)

第二个图层:标记群集
marker_cluster = MarkerCluster(name='标记数据').add_to(m)
for _ in range(100):
folium.Marker(
location=[random.uniform(37.7, 37.8), random.uniform(122.5, 122.4)],
popup='随机点',
icon=folium.Icon(color='orange')
).add_to(marker_cluster)

添加图层控制器
folium.LayerControl().add_to(m)

m.save("sf_layercontrol.html")
```

通过给图层对象(如 `HeatMap` 和 `MarkerCluster`)设置 `name` 参数,然后在地图对象 `m` 上调用 `folium.LayerControl().add_to(m)`,你就可以在地图的右上角看到一个图层控制器了。

四、 深度探索:`geopandas` 与地理空间数据

如果你的数据包含地理形状信息(如多边形、线段),那么 `geopandas` 将是你绘制更复杂、更精确地图的利器。`geopandas` 扩展了 `pandas` 的功能,使其能够处理地理空间数据。

1. 安装 `geopandas`

安装 `geopandas` 可能需要一些额外的依赖,建议使用 conda 来安装以避免冲突:

```bash
conda install geopandas
```

如果你使用 pip,可以尝试:

```bash
pip install geopandas
```

2. 读取地理空间数据

`geopandas` 可以读取多种地理空间数据格式,最常见的是 Shapefile (`.shp`)。

假设你有一个名为 `countries.shp` 的 Shapefile 文件,其中包含世界各国的地理边界信息。

```python
import geopandas as gpd
import folium

读取 Shapefile 文件
world_geo = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

过滤出亚洲国家 (示例)
asia = world_geo[world_geo['continent'] == 'Asia']

创建一个以亚洲中心为地图
m = folium.Map(location=[30, 100], zoom_start=3)

将 GeoDataFrame 的数据添加到 folium 地图
Choropleth 方法用于绘制分级统计地图
folium.Choropleth(
geo_data=asia.to_json(), GeoDataFrame 的 GeoJSON 格式
name='亚洲国家',
data=asia, 包含额外数据的 DataFrame
columns=['iso_a3', 'pop_est'], 关联的列: GeoDataFrame 的标识符和要显示的数据
key_on='feature.id', GeoJSON 中与 `columns` 关联的键
fill_color='YlGnBu', 颜色渐变方案
fill_opacity=0.7,
line_opacity=0.2,
legend_name='亚洲人口估计'
).add_to(m)

folium.LayerControl().add_to(m)
m.save("asia_choropleth.html")
```

这里的关键是 `folium.Choropleth()` 函数。它允许你根据数据为地理区域(多边形)着色,从而创建分级统计地图。你需要提供 GeoJSON 格式的地理数据,以及一个 DataFrame,其中包含与地理数据关联的数值。

3. 结合数据进行可视化

你可以将你自己的数据与地理空间数据合并,然后在地图上进行可视化。例如,你想根据国家的人均 GDP 来着色。

```python
import geopandas as gpd
import pandas as pd
import folium

读取世界各国地理数据
world_geo = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

创建一个示例的 GDP 数据 DataFrame
假设你的 GDP 数据是这样的格式:国家代码 (ISO A3), GDP
gdp_data = {
'iso_a3': ['USA', 'CAN', 'MEX', 'BRA', 'FRA', 'DEU', 'CHN', 'JPN', 'IND', 'AUS'],
'gdp_md_est': [23000, 1700, 1300, 1400, 2900, 4200, 17700, 5000, 3200, 1600]
}
gdp_df = pd.DataFrame(gdp_data)

将 GDP 数据合并到地理数据中
使用 'iso_a3' 列作为合并的键
world_gdp = world_geo.set_index('iso_a3').join(gdp_df.set_index('iso_a3')).reset_index()

移除没有 GDP 数据的行 (例如,如果某些国家数据缺失)
world_gdp = world_gdp.dropna(subset=['gdp_md_est'])

创建地图
m = folium.Map(location=[0, 0], zoom_start=2) 全球地图

绘制分级统计地图
folium.Choropleth(
geo_data=world_gdp.to_json(),
name='世界各国GDP',
data=world_gdp,
columns=['iso_a3', 'gdp_md_est'],
key_on='feature.id',
fill_color='PuBuGn', 不同的颜色方案
fill_opacity=0.7,
line_opacity=0.2,
legend_name='估计GDP (百万美元)'
).add_to(m)

folium.LayerControl().add_to(m)
m.save("world_gdp_choropleth.html")
```

通过 `set_index()` 和 `join()` 方法,你可以方便地将表格数据与地理数据关联起来。然后,`folium.Choropleth()` 就能将这些数据可视化到地图上。

五、 更多创意与可能性

上面介绍的只是 `folium` 和 `geopandas` 功能的冰山一角。还有许多其他强大的插件和技术,可以帮助你绘制出更加令人惊叹的地图:

`folium.plugins.Marker` 的 Popup HTML: 如前所述,你可以使用复杂的 HTML 来丰富标记的弹出信息,包括图表、图片等。
`folium.plugins.TimestampedGeoJson`: 用于创建随时间变化的地图动画,非常适合展示历史事件、数据演变等。
`folium.plugins.HeatMapWithTime`: 类似 `TimestampedGeoJson`,但专门用于创建随时间变化的热力图。
`folium.plugins.GeoJson` 的样式定制: 你可以更精细地控制 GeoJSON 数据的样式,比如为不同类型的地理要素设置不同的颜色和线宽。
结合其他可视化库: 考虑将 `matplotlib` 或 `seaborn` 生成的图表嵌入到 `folium` 的弹出窗口中,实现数据与地图的深度融合。
自定义 JavaScript 代码: 对于非常高级的需求,你可以直接在 `folium` 的 HTML 输出中插入自定义的 JavaScript 代码,利用 Leaflet.js 的全部潜力。

结语

用 Python 绘制漂亮的地图,是一次将数据转化为视觉语言的旅程。从 `folium` 提供的直观易用的接口,到 `geopandas` 赋予的地理空间处理能力,再到各种强大的插件和定制选项,Python 为我们打开了无限的地图绘制可能。

希望这篇文章能够为你提供一个坚实的基础和丰富的灵感。现在,轮到你了!去探索你的数据,发挥你的创意,用代码描绘出属于你自己的、独一无二的地图故事吧!

网友意见

user avatar

推荐一个超好用的python包folium, 专门用于地理数据可视化,官方英文教程教程点击这里,查看本文源代码请点击这里(想要Python编程资料的童鞋请直接拉至最底部)。

使用方法很简单,操作如下:

  1. 导入包,创建一副世界地图
       import folium import pandas as pd  # define the world map world_map = folium.Map()  # display world map world_map     

2. 输入经纬度,尺度,在这里我们以旧金山(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     

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

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

3. 读取数据集(旧金山犯罪数据集)

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

4. 在地图上显示前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)     

5. 添加地理标签

       # 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)     

6. 统计区域犯罪总数

       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)     

7. 读取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     

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

       # 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     

10. 创建热力图

       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     

本文源代码Jupyter notebook地址:

GitHub下载地址:

最后,folium还可以用来创建动态热力图,动态路径图等,具体可参考Medium上的这篇文章。

实现效果如下图所示 (直接从Medium上抱过来的图,详细代码请点击上述链接)。

----------------

最近好多小伙伴私信我推荐一些学习编程的经验,我给大家几点建议:

1. 尽量不去看那些冗长的视频教程,不是说学不到知识,而是,在你学到知识之前,你可能已经睡着了 =_=

2. 不要贪多,选一个知名度高的python教程,教学为辅,练习为主。每天用15分钟学习课程,剩余时间就用来做编程练习好了。要随时记住,我们学习python的目的在于会用,而不是背过了多少知识点。

嘻嘻,我想给大家推荐一款我超喜欢的python课程——夜曲编程。我闲没事在上面刷了一些编程题目,竟然回想起,当年备考雅思时被百词斩支配的恐惧。还别说,这款课程真是百词斩旗下的。哈哈,一股熟悉的亲切感扑面而来。

言归正传,这款课程对新手小白超级适合。虽然有手机app,但我建议你们用网页端学习(如果你是在地铁上用手机码代码的神仙,当我没说)。最关键的是,它是免费的!关注同名公众号可以直接领取(你懂的)

最后,我的终极建议是:无论选什么教程,贪多嚼不烂,好好专注一门课程,勤加练习才是提高编程水平的王道。等基础知识学的差不多了,去Kaggle上参加几场比赛,琢磨琢磨别人的编程思路和方法就完美啦!

我的其他回答

哪些 Python 库让你相见恨晚?

学习python中的pandas有没有好的教程推荐?

机器学习中的因果关系: 从辛普森悖论(常见的统计学谬误)谈起

欢迎大家关注我的机器学习笔记专栏,我将用小白也能听懂的语言,为大家讲述机器学习中那些有趣好玩的知识 (●'◡'●)

user avatar

简单梳理几个Python优质地图可视化工具,有的擅长交互、有的擅长学术研究、有的擅长商用地图展示,每一个都很666,记得文末点赞❤️❤️


Echarts/pyecharts

pyecharts擅长商业交互可视化,地图是其重要一部分,有大量demo,代码拿来即可用。快速入门 :快速上手pyecharts 三维动态世界地图

世界航线图

bus路径图

中国地图

可视化大屏

纽约街道数据

深入学习:github.com/pyecharts/py

Kepler.gl

kepler.glUber开源的用于大规模地理空间数据集的可视化探索工具,可在Jupyter Notebook中使用,这里仅仅展示一些demo,

深入学习:github.com/keplergl/kep


Basemap

Basemap为地理空间数据可视化利器,偏学院派。举个栗子,我们生活的蓝色星球全貌,

       import pyproj import geos from mpl_toolkits.basemap import Basemap # Basemap依赖pyproj和geos,三者一起导入,不然报错 import matplotlib.pyplot as plt  plt.figure(dpi=150,figsize=(6,6))  m = Basemap(     projection='ortho',  #指定投影方式ortho     lat_0=0,     lon_0=140,  #设置投影中心     resolution=None  #设置分辨率 ) m.bluemarble(scale=0.5) #设置蓝色弹珠 (The Blue Marble)背景  plt.show();      
更多栗子,

深入学习:matplotlib.org/basemap/


Folium

Folium是Python数据处理优势和JavaScript地图库Leaflet.js地图可视化优势的完美结合,二者结合后即可绘制优美的交互式地图。
一些栗子~

       import folium  whm = folium.Map(     location=[30.5538, 114.31589],  #武昌区经纬度     zoom_start=10,  # 默认放大倍数 )  folium.Marker(  #添加位置标示     location=[30.5538, 114.31589],     popup="❤️武汉",     icon=folium.Icon(color="#ba2f2a", icon="info-sign"), ).add_to(whm)  folium.CircleMarker(  #圈地     location=[30.5538, 114.31589],     radius=100,  #圈半径     color="#c72e29",     fill=True,     fill_color="#c72e29", ).add_to(whm)  folium.Marker(      location=[30.34653, 114.27001],     popup="❤️",     icon=folium.Icon(color="blue", icon="info-sign"), ).add_to(whm)  folium.CircleMarker(       location=[30.34653, 114.31001],     radius=100,      color="#01a2d9",     fill=True,     fill_color="#01a2d9", ).add_to(whm) whm      

再举个栗子,
Heatmap

       # Heatmap import numpy as np import folium from folium.plugins import HeatMap  data = (np.random.normal(size=(50, 3)) * np.array([[1, 1, 1]]) +         np.array([[39.904989, 116.4052859, 1]])).tolist()  m = folium.Map([39.904989, 116.4052859], zoom_start=6) HeatMap(data, radius=20).add_to(m) m      


Minicharts

Marker

ImageOverlay

choropleth

Heatmap with time

MiniMap

除此之外,Folium还有很多的插件

深入学习:python-visualization.github.io


ipyleaflet

ipyleafletJupyter Notebook的一个扩展擅长交互式地图
安装

       pip install ipyleaflet jupyter nbextension enable --py --sys-prefix ipyleaflet      

举个栗子,

       from ipyleaflet import Map, MagnifyingGlass, basemaps, basemap_to_tiles  m = Map(center=(30.5538, 114.31589), zoom=1.5)  topo_layer = basemap_to_tiles(basemaps.OpenTopoMap) magnifying_glass = MagnifyingGlass(layers=[topo_layer])  m.add_layer(magnifying_glass)  m      


更多栗子,

进一步学习:github.com/jupyter-widg


Cartopy

Cartopy为Basemap的继承者。
安装

       brew install proj geos #安装依赖 pip install cartopy -i https://pypi.tuna.tsinghua.edu.cn/simple #清华源光速安装      

举个栗子,
路线图

       import cartopy import matplotlib.pyplot as plt  plt.figure(dpi=150) plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  ax = plt.axes(projection=ccrs.PlateCarree())  #默认投影PlateCarree ax.stock_img()  x_lon, x_lat = -55, -10, wh_lon, wh_lat = 114.30943, 30.59982  plt.plot(     [x_lon, wh_lon],     [x_lat, wh_lat],     color='#dc2624',     linewidth=1,     marker='o',     transform=ccrs.Geodetic(), )  plt.plot(     [x_lon, wh_lon],     [x_lat, wh_lat],     color='#01a2d9',     linestyle='--',     transform=ccrs.PlateCarree(), )  plt.text(x_lon - 3,          x_lat - 12,          'xx市',          horizontalalignment='right',          transform=ccrs.Geodetic())  plt.text(wh_lon + 3,          wh_lat - 12,          '武汉',          horizontalalignment='left',          transform=ccrs.Geodetic())      


更多栗子,

交互图

风杆图

深入学习:scitools.org.uk/cartopy


geopandas

geopandas依赖pandas、fiona及matplotlib「GeoPandas是Pandas在地理数据处理方向的扩展,使用shapely地理数据分析、fiona执行地理数据读取、matplotlib执行绘图」。举几个栗子~

       import matplotlib.pyplot as plt import geopandas  #读入数据 world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres')) cities = geopandas.read_file(     geopandas.datasets.get_path('naturalearth_cities'))  #画图 fig, ax = plt.subplots(2, 1, dpi=200) world.plot(column='pop_est', cmap='Set1_r', ax=ax[0]) world.plot(column='gdp_md_est', cmap='Set1', ax=ax[1]) plt.show()      


更多例子,如Plotting with CartoPy

Choro legends

kdeplot

进一步学习:github.com/geopandas/ge


geoplot

geoplot是一个high-level的Python地理数据可视化工具,是cartopymatplotlib的扩展,geoplot 之于cartopy,犹如seaborn之于matplotlib.直接看demo:桑基图 (Sankey)

添加散点

添加核密度估计图

分级统计图

深入学习:github.com/ResidentMari


Plotly/plotly-express

专业的交互式可视化工具,在Python、R、JavaScript方向都有API,

快速入门:❤️快速上手plotly-express❤️
subplots

scatter

Marker/Line

choropleth

Density Heatmap

facets

深入学习:plotly.com/python/


欢迎关注❤️❤️:pythonic生物人

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有