You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pydeck H3ClusterLayer指定自定义分级颜色色阶?

实现Pydeck H3六边形的自定义分级颜色映射

需求说明

替换Pydeck中H3ClusterLayer的get_fill_color计算逻辑,基于count数值使用6级YlOrRd序列色阶进行分级着色。

解决方案步骤

1. 数据预处理

原JSON数据中count字段为字符串类型,需先转换为整数,方便后续数值计算:

df['count'] = df['count'].astype(int)

2. 定义YlOrRd 6级色阶

6级YlOrRd色阶的RGB值(从浅到深)如下:

ylorrd_6_colors = [
    [255, 255, 204],
    [255, 237, 160],
    [254, 178, 76],
    [254, 127, 45],
    [204, 76, 2],
    [153, 52, 4]
]

3. 为数据行分配对应颜色

使用pandas.qcut将count值等分为6个分位区间,每个区间匹配一个色阶颜色:

df['fill_color'] = pd.qcut(
    df['count'],
    q=6,
    labels=ylorrd_6_colors
)

4. 修改Pydeck图层配置

将get_fill_color参数改为引用预处理好的fill_color列,替代原计算逻辑:

h3_layer = pydeck.Layer(
    "H3ClusterLayer",
    df,
    pickable=True,
    stroked=True,
    filled=True,
    extruded=False,
    get_hexagons="hexIds",
    get_fill_color="fill_color",  # 使用预处理的颜色列
    get_line_color=[255, 255, 255],
    line_width_min_pixels=2,
)

完整代码

import pandas as pd
import pydeck

# 读取数据
df = pd.read_json('aus_h3.duckgl.json')

# 转换count为整数类型
df['count'] = df['count'].astype(int)

# 定义6级YlOrRd色阶
ylorrd_6_colors = [
    [255, 255, 204],
    [255, 237, 160],
    [254, 178, 76],
    [254, 127, 45],
    [204, 76, 2],
    [153, 52, 4]
]

# 为每个数据项分配颜色
df['fill_color'] = pd.qcut(
    df['count'],
    q=6,
    labels=ylorrd_6_colors
)

# 创建H3图层
h3_layer = pydeck.Layer(
    "H3ClusterLayer",
    df,
    pickable=True,
    stroked=True,
    filled=True,
    extruded=False,
    get_hexagons="hexIds",
    get_fill_color="fill_color",
    get_line_color=[255, 255, 255],
    line_width_min_pixels=2,
)

view_state = pydeck.ViewState(latitude=-25.7773677126431,
                              longitude=135.084939479828,
                              zoom=4,
                              bearing=0,
                              pitch=45)

# 生成HTML可视化页面
pydeck.Deck(
    layers=[h3_layer],
    initial_view_state=view_state,
    tooltip={"text": "Density: {count}"}
).to_html("aus_h3.duckgl.html")

补充说明

  • 若需自定义区间而非分位数,可使用pd.cut手动指定边界,示例:
    bins = [0, 10, 20, 40, 60, 80, 100]
    df['fill_color'] = pd.cut(
        df['count'],
        bins=bins,
        labels=ylorrd_6_colors,
        include_lowest=True
    )
    
  • 色阶颜色可按需调整,确保RGB值为0-255范围内的整数。

内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:24:53