如何使用Python和Folium在地图上绘制数据?

2021年11月28日06:31:37 发表评论 2,518 次浏览

如何使用Folium在地图中绘制数据Folium 是一个 python 包,它结合了 python 提供的所有工具,用于使用leaflet javascript 库来操作数据,以创建丰富的交互式地图。

和我的文章一样,我提供了一个 Google colab jupyter notebook,其中包含你可以在此处访问的所有代码和结果 。


创建基本地图

Python Folium如何在地图上绘制数据?在我们开始构建任何东西之前,让我们安装一些我们将在整个教程中使用的库。你可以使用任何打包工具,我将提供 pipenv 和 pip prepending 的示例!,以便它可以在像 Google colab 这样的 jupyter notebook 上运行。

pipenv install folium pandas

Or

!pip install folium pandas

安装好库后,创建地图就像 1 行代码一样简单:

import folium
folium.Map(location=[48.130518, 11.5364172], zoom_start=12)

Python绘制地图数据示例 - 这将自动生成一个交互式地图 并将其输出到 jupyter notebook,在那里你将能够与其进行交互。该函数Map采用一些可选参数,在我们的例子中,我们发送位置(坐标)和默认缩放级别。

如果一切顺利,你应该会看到这样的地图:

基本地图
基本地图

尽管这已经非常令人兴奋,但我们并没有做任何特别的事情。真正的威力folium来自于将库的映射能力与 Python 的数据操作能力相结合,所以让我们开始做一些事情。


添加标记

我们可以添加到地图中的一项基本功能是能够标记地点以便轻松找到它们,或者突出显示重要信息。

这可以使用Markerfrom 函数轻松完成folium,如下所示:

m = folium.Map(location=[48.218871184761596, 11.624819877497147], zoom_start=15)

tooltip = "Click Here For More Info"

marker = folium.Marker(
    location=[48.218871184761596, 11.624819877497147],
    popup="<stong>Allianz Arena</stong>",
    tooltip=tooltip)
marker.add_to(m)

m

与第一个示例类似,首先我们创建了一个地图对象,然后我们也创建了一个标记对象。该标记 物是通过将坐标点创建的,我们要显示在弹出时的标记和其他选项中的标记工具提示有人点击。

带标记的地图
带标记的地图

标记有大量的配置选项,因为标记弹出窗口需要 HTML,所以有很多可能性。但是如果我们想在弹出窗口中显示图表怎么办?有没有简单的方法?

标记的图表弹出窗口

如何使用Folium在地图中绘制数据?Folium为任何标记类型的可视化提供内置支持。可视化由库vincent 和altair启用 。

Python绘制地图数据示例:为了渲染一些可视化,我们需要一些数据,所以让我们先得到它:

import json

import requests

url = (
    "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data"
)
data = json.loads(requests.get(f"{url}/vis1.json").text)

接下来,让我们在标记中绘制数据:

m = folium.Map(location=[48.218871184761596, 11.624819877497147], zoom_start=15, tiles="Stamen Terrain")

marker = folium.Marker(
    location=[48.218871184761596, 11.624819877497147],
    popup=folium.Popup(max_width=450).add_child(
        folium.Vega(data, width=450, height=250)
    ),
)

marker.add_to(m)

m
伴随着标记和地图的地图
带有标记和绘图的地图

太棒了,但我们真的可以改变标记本身而不仅仅是弹出窗口吗?简短的回答是肯定的,并且几乎可以使用任何东西。

自定义标记

Python Folium如何在地图上绘制数据?该Marker函数允许进行多种参数化,从更改预定义图标库中的标记图标、形状到使用 HTML 构建你自己的标记,在本文中,我们将看到这 3 个的示例,首先使用预定义的图标:

m = folium.Map(location=[48.218871184761596, 11.624819877497147], zoom_start=15)

tooltip = "Click Here For More Info"

marker = folium.Marker(
    location=[48.218871184761596, 11.624819877497147],
    icon=folium.Icon(icon="cloud"),
    popup="<stong>Allianz Arena</stong>",
    tooltip=tooltip)
marker.add_to(m)

m
带有标志的地图
带有图标标记的地图

回到我们简单的 Allianz Arena 示例,我们现在更改了带有云的标记的图标,但是这些图标来自哪里?有哪些选择?

图标来自引导程序库,但你也可以使用很棒的字体。

接下来让我们使用形状,如圆形来构建我们的标记:

m = folium.Map(location=[48.218871184761596, 11.624819877497147], zoom_start=15)

tooltip = "Click Here For More Info"

marker = folium.CircleMarker(
    location=[48.218871184761596, 11.624819877497147],
    radius=50,
    popup="<stong>Allianz Arena</stong>",
    tooltip=tooltip)
marker.add_to(m)

m
带标记的地图
带圆圈标记的地图

最后,我们可以使用 HTML 来构建我们想要的任何类型的标记。

m = folium.Map(location=[48.218871184761596, 11.624819877497147], zoom_start=15)

tooltip = "Click Here For More Info"

marker = folium.Marker(
    location=[48.218871184761596, 11.624819877497147],
    popup="<stong>Allianz Arena</stong>",
    icon=folium.DivIcon(html=f"""
      <div style="color:#f00;background:#fff;width:60px;text-align:center;">MARKER</div>
    """),
    tooltip=tooltip)
marker.add_to(m)

m
带 HTML 标记的地图
带 HTML 标记的地图

在最后一个示例中,我们使用 HTML 创建一个 DIV 元素并放置一些文本作为标记,但我们可以使用 SVG 并呈现你想要的任何内容。请记住将你的 HTML 居中,以便标记位于正确的位置,这是我在示例中没有做的。


等值线地图

如何使用Folium在地图中绘制数据?Choropleth 地图是流行的专题地图,用于通过预定地理区域(即国家或州)上的各种阴影模式或符号来表示统计数据。他们擅长利用数据来轻松表示跨区域所需测量的可变性。

为了创建等值线图,我们需要使用两种类型的数据,我们想要表示的阴影或颜色的统计数据,以及地理空间数据。

Python绘制地图数据示例:在我们的示例中,我们将使用美国各州来定义地区,以及美国失业统计数据(非真实数据)。

让我们从绘制地理区域开始,即美国各州:

data_url = (
    "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data"
)
us_states_url = f"{data_url}/us-states.json"

m = folium.Map([43, -100], zoom_start=4)

folium.GeoJson(us_states_url).add_to(m)

m
美国各州
美国各州

我们的新地图现在包含一个突出显示美国各州的叠加层,但我们可以做得更多,我们现在可以使用我们拥有的有关美国失业率的统计信息,并突出显示失业率越来越高的州。

首先,让我们看看数据是什么样的:

import pandas as pd

us_unemployment_url = f"{data_url}/US_Unemployment_Oct2012.csv"
unemployment = pd.read_csv(us_unemployment_url)

unemployment.head()
state失业
0AL7.1
1AK6.8
2AZ8.1
3AR7.2
4CA10.1

数据非常简单,一列包含州,下一列包含失业率。

有了这个,我们可以开始给我们的地图着色:

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=us_states,
    name='choropleth',
    data=unemployment,
    columns=['State', 'Unemployment'],
    key_on='feature.id',
    fill_color='YlGn',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Unemployment Rate %'
).add_to(m)

m
美国失业率(假数据)
美国失业率(假数据)

做得很好!


热图

Python Folium如何在地图上绘制数据?热图是另一种流行的地图选择,它们可用于多种用途,包括天气状况、污染、人口密度等。

他们是非常强大的工具和的帮助下pandasfolium超级容易建立。让我们以芝加哥市的自行车站为例。我在网上找到了一个有趣的数据集,其中包含带有坐标的自行车站,我们将用它来构建热图。

让我们加载数据:

stations_url = 'https://gbfs.divvybikes.com/gbfs/en/station_information.json'

stations = json.loads(requests.get(stations_url).text)['data']['stations']
stations = pd.json_normalize(stations)
stations = stations[['lat', 'lon']]


stations.head()
编号latlon
041.876511-87.620548
141.867226-87.615355
241.856268-87.613348
341.874053-87.627716
441.886976-87.612813

自行车站数据有多个包含大量数据的列,但是出于我们的目的,我们只需要坐标,因此我们删除了其余部分。现在每一行代表一组坐标(纬度和经度),其中放置了一个自行车站。

Python绘制地图数据示例:接下来,我们将构建一个热图来突出城市中自行车站较为集中的区域。

from folium import plugins

m = folium.Map([41.8781, -87.6298], zoom_start=11)

# convert to (n, 2) nd-array format for heatmap
stationArr = stations.values

# plot heatmap
m.add_child(plugins.HeatMap(stationArr, radius=15))
m
带热图的地图
带热图的地图

做得好!热图的秘密是简单地使用一个插件来folium传递一个矩阵,其中包含每个站点的纬度和经度以及半径。


地图图块

如何使用Folium在地图中绘制数据?最后,在结束之前,我想强调folium地图图块的另一个功能。到目前为止,我们使用了一种类型的地图渲染,但是我们可以使用许多选项,每个选项都会使地图看起来不同。

让我们看一些例子:

m = folium.Map(location=[30.4407159,-66.6017203], zoom_start=3)
folium.TileLayer('stamenterrain').add_to(m)
m
带有雄蕊地形图层的地图
带有雄蕊地形图层的地图
m = folium.Map(location=[30.4407159,-66.6017203], zoom_start=3)
folium.TileLayer('stamentoner').add_to(m)
m
带有雄蕊调色剂层的地图
带有雄蕊调色剂层的地图

或者更好的是,你可以通过使用另一个称为 layerControl

m = folium.Map(location=[30.4407159,-66.6017203], zoom_start=4)

# Add tiles
folium.TileLayer('stamentoner').add_to(m)
folium.TileLayer('stamenwatercolor').add_to(m)
folium.TileLayer('cartodbpositron').add_to(m)
folium.TileLayer('openstreetmap').add_to(m)

# Add the option to switch tiles
folium.LayerControl().add_to(m)

m
具有多个图层的地图
具有多个图层的地图

Python Folium如何在地图上绘制数据?你现在可以在这张地图的右上角看到一个图层选择,用户可以使用它在图块之间切换。


Python绘制地图数据示例结论

写这篇文章超级有趣!Folium提供了大量的配置选项,大量的机会来构建伟大的地图,我肯定会继续玩它来制作一些有趣的东西。

在研究这个主题时,我遇到了一些问题,因为文档不是很好,但是,在他们的github 页面上 ,他们提供了很好的示例,你可以运行并查看如何实现我们今天学到的一些东西。我强烈建议通过它们。

谢谢阅读!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: