空间数据可视化神器,Pydeck!

Pydeck是一个基于deck.gl的Python库,用于创建高质量的空间数据可视化。它支持多种可视化类型,如弧形图(展示通勤路径)、3D柱状图(展示房价分布)、图标图(展示地理位置分布)、流向图(展示航班路线)、路径图(展示交通线路)、散点图(展示地铁站出口数量)等。通过简单的代码,用户可以创建交互式且复杂的地图可视化效果。博客提供了多个示例代码,帮助读者了解如何利用Pydeck进行数据可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:法纳斯特

今天给大家介绍一款超赞的空间(地理)数据可视化神器:Pydeck。

Pydeck库通过deck.gl对数据进行空间可视化渲染,对3D的可视化支持非常强。

使用文档:

https://pydeck.gl/index.html

GitHub:

https://github.com/visgl/deck.gl/tree/master/bindings/pydeck

d7870c8251b0da55df50f0c563c4d7ff.gif

通过下面的命令进行安装。

# 安装
pip install pydeck -i https://mirror.baidu.com/pypi/simple

可以在jupyter notebook及IDE上运行,其中jupyter上需要安装相关的插件。

# 启用Pydeck
jupyter nbextension install --sys-prefix --symlink --overwrite --py pydeck
jupyter nbextension enable --sys-prefix --py pydeck

接下来,就给大家介绍一下相关的可视化案例。

使用的数据及代码都已上传,可在文末获取~

 弧形图

c5dd8f488a3a1a9dc3a74a5e328d42f9.png

打工人下班后的通勤情况,起点位于旧金山市中心(绿色),终点为目的地(红色)。

数据由美国人口普查局收集。

地址:

https://lehd.ces.census.gov/data/

代码如下。

import pydeck as pdk
import pandas as pd

DATA_URL = "https://raw.githubusercontent.com/ajduberstein/sf_public_data/master/bay_area_commute_routes.csv"
# A bounding box for downtown San Francisco, to help filter this commuter data
DOWNTOWN_BOUNDING_BOX = [
    -122.43135291617365,
    37.766492914983864,
    -122.38706428091974,
    37.80583561830737,
]


def in_bounding_box(point):
    """Determine whether a point is in our downtown bounding box"""
    lng, lat = point
    in_lng_bounds = DOWNTOWN_BOUNDING_BOX[0] <= lng <= DOWNTOWN_BOUNDING_BOX[2]
    in_lat_bounds = DOWNTOWN_BOUNDING_BOX[1] <= lat <= DOWNTOWN_BOUNDING_BOX[3]
    return in_lng_bounds and in_lat_bounds


df = pd.read_csv(DATA_URL)
# Filter to bounding box
df = df[df[["lng_w", "lat_w"]].apply(lambda row: in_bounding_box(row), axis=1)]

GREEN_RGB = [0, 255, 0, 40]
RED_RGB = [240, 100, 0, 40]

# Specify a deck.gl ArcLayer
arc_layer = pdk.Layer(
    "ArcLayer",
    data=df,
    get_width="S000 * 2",
    get_source_position=["lng_h", "lat_h"],
    get_target_position=["lng_w", "lat_w"],
    get_tilt=15,
    get_source_color=RED_RGB,
    get_target_color=GREEN_RGB,
    pickable=True,
    auto_highlight=True,
)

view_state = pdk.ViewState(latitude=37.7576171, longitude=-122.5776844, bearing=45, pitch=50, zoom=8,)


TOOLTIP_TEXT = {"html": "{S000} jobs <br /> Home of commuter in red; work location in green"}
r = pdk.Deck(arc_layer, initial_view_state=view_state, tooltip=TOOLTIP_TEXT)
r.to_html("arc_layer.html")

 3D柱状图

4b6b87df2d665028ce7a2000bdcce157.png

加拿大温哥华的房价情况,输入数据是GeoJSON格式的。

代码如下。

import pydeck as pdk

DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/geojson/vancouver-blocks.json"
LAND_COVER = [[[-123.0, 49.196], [-123.0, 49.324], [-123.306, 49.324], [-123.306, 49.196]]]

INITIAL_VIEW_STATE = pdk.ViewState(latitude=49.254, longitude=-123.13, zoom=11, max_zoom=16, pitch=45, bearing=0)

polygon = pdk.Layer(
    "PolygonLayer",
    LAND_COVER,
    stroked=False,
    # processes the data as a flat longitude-latitude pair
    get_polygon="-",
    get_fill_color=[0, 0, 0, 20],
)

geojson = pdk.Layer(
    "GeoJsonLayer",
    DATA_URL,
    opacity=0.8,
    stroked=False,
    filled=True,
    extruded=True,
    wireframe=True,
    get_elevation="properties.valuePerSqm / 20",
    get_fill_color="[255, 255, properties.growth * 255]",
    get_line_color=[255, 255, 255],
)

r = pdk.Deck(layers=[polygon, geojson], initial_view_state=INITIAL_VIEW_STATE)

r.to_html("geojson_layer.html")

 图标图

58dea648595d5f9e2546eca6d0bc722e.png

德国啤酒花园的位置分布情况。

代码如下。

import pydeck as pdk
import pandas as pd


# Data from OpenStreetMap, accessed via osmpy
DATA_URL = "https://raw.githubusercontent.com/ajduberstein/geo_datasets/master/biergartens.json"
ICON_URL = "https://upload.wikimedia.org/wikipedia/commons/c/c4/Projet_bi%C3%A8re_logo_v2.png"

icon_data = {
    # Icon from Wikimedia, used the Creative Commons Attribution-Share Alike 3.0
    # Unported, 2.5 Generic, 2.0 Generic and 1.0 Generic licenses
    "url": ICON_URL,
    "width": 242,
    "height": 242,
    "anchorY": 242,
}

data = pd.read_json(DATA_URL)
data["icon_data"] = None
for i in data.index:
    data["icon_data"][i] = icon_data

view_state = pdk.data_utils.compute_view(data[["lon", "lat"]], 0.1)

icon_layer = pdk.Layer(
    type="IconLayer",
    data=data,
    get_icon="icon_data",
    get_size=4,
    size_scale=15,
    get_position=["lon", "lat"],
    pickable=True,
)

r = pdk.Deck(layers=[icon_layer], initial_view_state=view_state, tooltip={"text": "{tags}"})
r.to_html("icon_layer.html")

 流向图

f58bd59c0c005e17ba8b159769ec17ba.png

从希思罗机场飞往欧洲各地的航班路线图。

代码如下。

import pydeck as pdk

DATA_URL = {
    "AIRPORTS": "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/line/airports.json",
    "FLIGHT_PATHS": "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/line/heathrow-flights.json",  # noqa
}

INITIAL_VIEW_STATE = pdk.ViewState(latitude=47.65, longitude=7, zoom=4.5, max_zoom=16, pitch=50, bearing=0)

# RGBA value generated in Javascript by deck.gl's Javascript expression parser
GET_COLOR_JS = [
    "255 * (1 - (start[2] / 10000) * 2)",
    "128 * (start[2] / 10000)",
    "255 * (start[2] / 10000)",
    "255 * (1 - (start[2] / 10000))",
]

scatterplot = pdk.Layer(
    "ScatterplotLayer",
    DATA_URL["AIRPORTS"],
    radius_scale=20,
    get_position="coordinates",
    get_fill_color=[255, 140, 0],
    get_radius=60,
    pickable=True,
)

line_layer = pdk.Layer(
    "LineLayer",
    DATA_URL["FLIGHT_PATHS"],
    get_source_position="start",
    get_target_position="end",
    get_color=GET_COLOR_JS,
    get_width=10,
    highlight_color=[255, 255, 0],
    picking_radius=10,
    auto_highlight=True,
    pickable=True,
)

layers = [scatterplot, line_layer]

r = pdk.Deck(layers=layers, initial_view_state=INITIAL_VIEW_STATE)
r.to_html("line_layer.html")

 路径图

5b2a87bdeaf4a874b999f34d2c0ffea2.png

湾区快速交通线路图。

代码如下。

import pandas as pd
import pydeck as pdk

DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/bart-lines.json"
df = pd.read_json(DATA_URL)


def hex_to_rgb(h):
    h = h.lstrip("#")
    return tuple(int(h[i : i + 2], 16) for i in (0, 2, 4))


df["color"] = df["color"].apply(hex_to_rgb)


view_state = pdk.ViewState(latitude=37.782556, longitude=-122.3484867, zoom=10)

layer = pdk.Layer(
    type="PathLayer",
    data=df,
    pickable=True,
    get_color="color",
    width_scale=20,
    width_min_pixels=2,
    get_path="path",
    get_width=5,
)

r = pdk.Deck(layers=[layer], initial_view_state=view_state, tooltip={"text": "{name}"})
r.to_html("path_layer.html")

 散点图

ecd957f553ab3fb0a1416d62abda6b5d.png

旧金山市内各地铁站的出口数量图。

代码如下。

import pydeck as pdk
import pandas as pd
import math

SCATTERPLOT_LAYER_DATA = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/bart-stations.json"
df = pd.read_json(SCATTERPLOT_LAYER_DATA)

# Use pandas to calculate additional data
df["exits_radius"] = df["exits"].apply(lambda exits_count: math.sqrt(exits_count))

# Define a layer to display on a map
layer = pdk.Layer(
    "ScatterplotLayer",
    df,
    pickable=True,
    opacity=0.8,
    stroked=True,
    filled=True,
    radius_scale=6,
    radius_min_pixels=1,
    radius_max_pixels=100,
    line_width_min_pixels=1,
    get_position="coordinates",
    get_radius="exits_radius",
    get_fill_color=[255, 140, 0],
    get_line_color=[0, 0, 0],
)

# Set the viewport location
view_state = pdk.ViewState(latitude=37.7749295, longitude=-122.4194155, zoom=10, bearing=0, pitch=0)

# Render
r = pdk.Deck(layers=[layer], initial_view_state=view_state, tooltip={"text": "{name}\n{address}"})
r.to_html("scatterplot_layer.html")

 其他

案例较多,这里就不贴代码,直接展示啦!

938a202244ad9acb7dcdec4f8b07b045.png

渲染了10k个点。

d80d64095a9ab53768c2c2e93f48b649.png

1906年,Britton&Rey绘制的旧金山1906年火灾地图,覆盖在交互式的旧金山地图上。

2e49d015726fc9da3b13b0403a85cf3d.png

台北房价。数据为2012-2013年。柱子的高度表示单位面积价格的上升,颜色表示离地铁站的距离。

f0ababe824cd3f039fd656ded26c800c.png

2006年美国新墨西哥州饲养的牲畜的位置。

家禽的位置是蓝色的,牛的位置是橙色的。与Mapbox上的卫星图像叠加以突出地形如何影响农业。

87e1f181841a8e50b04705579b2e6fd7.png

通用样式,一幅世界地图。

72151a4fb49a1f7a94c6924f85d036c4.png

通过geopandas的数据,绘制世界地图。

其中geopandas安装起来有点费劲,建议使用whl安装包。

cb1ab2ae274fca1a9e70f4987a021a54.png

世界上超过33000个发电厂按照它们的生产能力(以高度表示)和燃料类型(绿色,如果可再生的话)绘制在一个球形地图上。

34d92c93b22f262b0ea089293725c990.png

旧金山国际机场直飞航线图。起点是绿色的,目的地是蓝色的。

5e9fd6fcba9ec9fd4d2722f961730155.png

旧金山自行车停车地点的分布情况。

81f23dfc2f09ac3f3a08db2814fa380a.png

660b50f79c71819857585b11ae404127.png

网格地图。

e5c12692a112ad0876e3dee5bfff094d.png

2006年在美国新墨西哥州饲养牲畜的位置热力图。

家禽的位置是蓝色的,牛的位置是橙色的。与Mapbox上的卫星图像叠加以突出地形如何影响农业。

7d77cfc22359573d711263de1e684d95.png

英国从1979年起发生的人身伤害交通事故。

e68866a88f06a12a7346d39c8ceacfd0.png

点云图,激光扫描,由无数个点组成。

11e2a0e40a11f92fc957307cb28b9e46.png

加拿大温哥华的房价情况。

d9f7b357a9b35560819c2a945261aff5.png

这个不知道是啥玩意...

af490ded5830c0671326ce7da48131ff.png

在旧金山内的自行车停车位,将数据聚合网格。

7705357bd5e4d47cbc471826b46497f1.png

使用AWS开放数据和Mapbox卫星图像制作一个地形图。

09c25aa9c4e954920d5955a977a81dc3.png

旧金山市内各种公共交通站点的名称,在站点的位置上标出。

026ac029ed8f647bb81d186fff2dded6.png

一辆共享单车在旧金山的骑行情况,从开始到逐渐消失。

好了,以上就是今天分享的内容,大家可以自行去动手练习。

这里小F用到了Mapbox地图,是需要自行去注册,获取token。

地址:

https://account.mapbox.com/

066d80f8923fd484509287b83dbff600.png

然后在pydeck的deck方法中,将token添加到api_keys参数即可。

cb63f541b95dd43052e74304fc5979eb.png

-------- End --------

a8daa97d3890dcadc36529497a6ea477.png
精选资料

回复关键词,获取对应的资料:

关键词资料名称
600《Python知识手册》
md《Markdown速查表》
time《Python时间使用指南》
str《Python字符串速查表》
pip《Python:Pip速查表》
style《Pandas表格样式配置指南》
mat《Matplotlib入门100个案例》
px《Plotly Express可视化指南》
精选内容

数据科学: VS Code 中 Python配置使用指南 | 财经工具 Tushare | Matplotlib 最有价值的 50 个图表

书籍阅读: 如何阅读一本书 | 巴菲特之道 | 价值 | 原则 | 投资最重要的事 | 戴维斯王朝 | 客户的游艇在哪里 | 刻意练习 | 林肯传 | 金字塔原理

投资小结: 2021Q4 | 2021Q3 | 2021Q2 | 2021Q1 | 2020Q4

精选视频

可视化: Plotly Express

财经: Plotly在投资领域的应用 | 绘制K线图表

排序算法: 汇总 | 冒泡排序 | 选择排序 | 快速排序 | 归并排序 | 堆排序 | 插入排序 | 希尔排序 | 计数排序 | 桶排序 | 基数排序

df4523aa5883a27b3fa4878b62f3926c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值