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

如何在Plotly Choropleth地图中实现自定义颜色比例尺及解决失效问题

问题:Plotly Choropleth地图自定义颜色比例尺不生效,需手动设置特定国家颜色

我用Plotly创建世界Choropleth地图时,遇到两个问题:

  • 自定义的color_scale完全没生效,无法通过颜色比例尺提升可视化可读性
  • 需要手动给特定国家设置单独的颜色

以下是我当前的代码:

import pandas as pd
import plotly.express as px

# Load the CSV data
df = pd.read_csv('path_to_your_csv_directory/*.csv')

# Define color scale ranges and colors
color_scale = [
    (0, '#E7F5E2'),  # less than 1,000
    (1001, '#CFEDC9'),  # 1,001-5,000
    (5001, '#B5E3AD'),  # 5,001-10,000
    (10001, '#7BC87B'),  # 10,001-50,000
    (50001, '#248C45'),  # 50,001-100,000
    (100001, '#00441A')  # more than 100,000
]

# Plot the choropleth map with custom color scale and legend
fig = px.choropleth(df, 
                     locations='Country', 
                     locationmode='country names', 
                     color='Jan-Dec', 
                     hover_name='Country', 
                     title='Choropleth Map',
                     color_continuous_scale=color_scale,
                     labels={'Jan-Dec': 'Population'})
fig.update_geos(projection_type='natural earth')
fig.show()

# Add a color bar legend
fig.update_layout(coloraxis_colorbar=dict(
    title='Population',
    tickvals=[0, 1000, 5000, 10000, 50000, 100000],
    ticktext=['< 1,000', '1,001-5,000', '5,001-10,000', '10,001-50,000', '50,001-100,000', '> 100,000']
))

# Update colorbar title font size
fig.update_layout(coloraxis_colorbar_title_font_size=14)

# Update colorbar tick labels font size
fig.update_layout(coloraxis_colorbar_tickfont_size=12)

fig.update_geos(projection_type='natural earth')
fig.show()

问题原因

  1. 颜色比例尺格式错误:Plotly的color_continuous_scale要求刻度为0-1之间的归一化数值,而非原始数据的绝对值。你直接使用原始数据阈值(如1001、5001),Plotly无法识别。
  2. 重复调用fig.show():第一次显示后再修改布局,会导致两次显示的结果不一致,混淆视觉效果。
  3. 缺少特定国家设色逻辑:当前代码未实现手动指定国家颜色的功能。

解决方案

1. 修正颜色比例尺格式

将原始数据阈值转换为0-1的归一化值,计算方式为:(阈值 - 数据最小值) / (数据最大值 - 数据最小值)。若要固定刻度区间,可直接基于设定的最大值归一化。

2. 实现特定国家手动设色

通过添加Scattergeo图层覆盖特定国家的原有颜色,不影响其他国家的颜色映射。

3. 优化代码结构

合并update_layout调用,避免重复显示。


完整修正代码

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

# 加载CSV数据
df = pd.read_csv('path_to_your_csv_directory/*.csv')

# ----------------------
# 1. 定义归一化颜色比例尺
# ----------------------
# 自定义区间阈值与对应颜色
thresholds = [0, 1000, 5000, 10000, 50000, 100000, float('inf')]
colors = ['#E7F5E2', '#CFEDC9', '#B5E3AD', '#7BC87B', '#248C45', '#00441A']

# 基于设定的最大值归一化刻度(若数据最大值超过100000,替换为df['Jan-Dec'].max())
max_val = 100000
color_scale = [(thresh / max_val, color) for thresh, color in zip(thresholds[:-1], colors)]
color_scale.append((1.0, colors[-1]))  # 确保最后一个刻度对应最大值以上区间

# ----------------------
# 2. 创建基础Choropleth地图
# ----------------------
fig = px.choropleth(df, 
                     locations='Country', 
                     locationmode='country names', 
                     color='Jan-Dec', 
                     hover_name='Country', 
                     title='世界人口分布Choropleth地图',
                     color_continuous_scale=color_scale,
                     labels={'Jan-Dec': '人口数量'},
                     range_color=(0, max_val))  # 锁定颜色范围匹配自定义区间

# ----------------------
# 3. 手动设置特定国家颜色(示例:高亮中国、美国为红色)
# ----------------------
highlight_countries = ['China', 'United States']
highlight_df = df[df['Country'].isin(highlight_countries)]

fig.add_trace(go.Scattergeo(
    locations=highlight_df['Country'],
    locationmode='country names',
    marker=dict(
        size=1,  # 不显示点,仅覆盖颜色
        color='#FF0000',  # 自定义高亮颜色
        line_width=0
    ),
    hoverinfo='skip'  # 不覆盖原有hover信息
))

# ----------------------
# 4. 统一优化布局与颜色条
# ----------------------
fig.update_layout(
    coloraxis_colorbar=dict(
        title='人口数量',
        title_font_size=14,
        tickfont_size=12,
        tickvals=[0, 1000, 5000, 10000, 50000, 100000],
        ticktext=['< 1,000', '1,001-5,000', '5,001-10,000', '10,001-50,000', '50,001-100,000', '> 100,000']
    ),
    geo=dict(projection_type='natural earth')
)

fig.show()

关键说明

  • 颜色比例尺修正:归一化后的刻度能被Plotly正确识别,若数据范围变动,只需调整max_val即可。
  • 特定国家设色:通过Scattergeo图层覆盖颜色,不会破坏原有颜色映射逻辑,可自由扩展highlight_countries列表。
  • 布局优化:合并所有布局修改,避免重复操作,确保显示效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:43:26