如何为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
相关产品推荐
相关产品推荐

