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

Plotly美国地图多类别州对角条纹填充问题求助

Plotly美国地图:多类别州对角条纹填充解决方案

问题描述

使用Plotly制作美国地图时,部分州(如俄勒冈州OR)同时属于多个类别,需要用对应类别的颜色以对角条纹形式填充,但当前OR仅显示灰色,无法呈现混合条纹效果。现有数据结构如下:

State  Category
===============
OR     3
OR     4
PA     1
SD     2
...

原代码通过循环添加Choropleth trace,试图用colorscale实现颜色混合,但未达到预期效果。

原代码问题分析

  1. 重复Trace覆盖:OR在数据中出现两次,循环会添加两个OR的Trace,后添加的会覆盖前一个,导致最终仅显示最后一次的颜色设置
  2. Colorscale无法实现条纹:通过colorscale设置的是颜色渐变过渡,并非条纹图案,不符合需求
  3. 未利用Plotly图案填充属性:Choropleth支持pattern参数实现条纹等填充样式,但原代码未使用

修改方案与代码实现

核心思路:对多类别州,拆分添加两个Choropleth Trace——一个作为基础颜色层,另一个添加对角条纹样式,叠加后实现两种颜色的条纹混合效果。

import plotly.graph_objects as go
import pandas as pd

# 假设df为已清洗好的原始数据
# 按州分组,汇总每个州的所有类别
state_categories = df.groupby('State')['Cat_numeric'].unique().reset_index()

# 类别与颜色映射
category_colors = {
    1: '#68a2cc',      
    2: '#dde729',      
    3: '#85b3a3',      
    4: '#ffb81d'      
}

fig = go.Figure()

# 先添加所有单类别州的地图Trace
for idx, row in state_categories.iterrows():
    state = row['State']
    categories = row['Cat_numeric']
    # 仅处理单类别州
    if len(categories) == 1:
        cat = categories[0]
        fig.add_trace(go.Choropleth(
            locationmode='USA-states',
            locations=[state],
            z=[cat],
            colorscale=[[0, category_colors[cat]], [1, category_colors[cat]]],
            showscale=False,
            hoverinfo='location+z'
        ))

# 处理多类别州(以OR为例,可扩展到所有多类别州)
target_state = 'OR'
multi_cats = state_categories[state_categories['State'] == target_state]['Cat_numeric'].iloc[0]

# 添加第一个类别的基础颜色层
fig.add_trace(go.Choropleth(
    locationmode='USA-states',
    locations=[target_state],
    z=[multi_cats[0]],
    colorscale=[[0, category_colors[multi_cats[0]]], [1, category_colors[multi_cats[0]]]],
    showscale=False,
    hoverinfo='location+z'
))

# 添加第二个类别的对角条纹层
fig.add_trace(go.Choropleth(
    locationmode='USA-states',
    locations=[target_state],
    z=[multi_cats[1]],
    colorscale=[[0, category_colors[multi_cats[1]]], [1, category_colors[multi_cats[1]]]],
    showscale=False,
    hoverinfo='location+z',
    # 设置对角条纹图案
    pattern=dict(
        shape='/',  # 右上到左下的斜线,用'\'可改为左上到右下
        fillmode='replace',
        size=10,    # 条纹尺寸
        solidity=0.5# 条纹密度,值越大条纹越粗
    )
))

# 设置美国地图布局
fig.update_layout(
    geo=dict(
        scope='usa',
        projection=go.layout.geo.Projection(type='albers usa')
    )
)

fig.show()

关键修改说明

  • 数据分组处理:通过groupby汇总每个州的类别,避免重复添加单类别州的Trace,同时快速识别多类别州
  • 分层叠加Trace:多类别州分两次添加Trace,基础层显示第一种颜色,条纹层显示第二种颜色并通过pattern设置对角条纹
  • 图案参数调整:shape控制条纹方向,solidity控制条纹粗细,可根据需求调整参数优化显示效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:52:51