新知一下
海量新知
6 2 9 1 1 1 8

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

Python绿色通道 | 学Python最好的地方 2022/01/18 15:00

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

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

使用文档:

https://pydeck.gl/index.html

GitHub:

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

新知达人, 空间数据可视化神器,Pydeck!

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

# 安装

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

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

# 启用Pydeck

jupyter nbextension install --sys-prefix --symlink --overwrite --py pydeck

jupyter nbextension enable --sys-prefix --py pydeck

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

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

 弧形图

新知达人, 空间数据可视化神器,Pydeck!

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

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

地址:

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 = [0255040]

RED_RGB = [240100040]

# 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 柱状图

新知达人, 空间数据可视化神器,Pydeck!

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

代码如下。

import pydeck as pdk

DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/geojson/vancouver-blocks.json"

LAND_COVER = [[[-123.049.196], [-123.049.324], [-123.30649.324], [-123.30649.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=[00020],

)

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=[255255255],

)

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

r.to_html("geojson_layer.html")

图标图

新知达人, 空间数据可视化神器,Pydeck!

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

代码如下。

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

流向图

新知达人, 空间数据可视化神器,Pydeck!

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

代码如下。

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=[2551400],

    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=[2552550],

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

路径图

新知达人, 空间数据可视化神器,Pydeck!

湾区快速交通线路图。

代码如下。

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], 16for i in (024))

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

 散点图

新知达人, 空间数据可视化神器,Pydeck!

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

代码如下。

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=[2551400],

    get_line_color=[000],

)

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

 其他

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

新知达人, 空间数据可视化神器,Pydeck!

渲染了10k个点。

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

新知达人, 空间数据可视化神器,Pydeck!

网格地图。

新知达人, 空间数据可视化神器,Pydeck!

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

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

新知达人, 空间数据可视化神器,Pydeck!

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

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

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

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

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

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

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

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

地址:

https://account.mapbox.com/

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

更多“数据可视化”相关内容

更多“数据可视化”相关内容

新知精选

更多新知精选