如何在Plotly Choropleth地图中设置自定义分箱与刻度?
解决Plotly Choropleth多数量级数据自定义刻度/分箱问题
问题根源
你当前代码的核心问题是:color参数传入的是log10转换后的数据,但colorbar的tickvals用的是原始数据值,两者不匹配,导致刻度无法正确对应颜色。另外原代码中locations='value'是错误的,locations应传入国家代码(如ISO 3166-1 alpha-3)或国家名称列,否则地图无法正确渲染。
修正方案(连续颜色+自定义对数刻度)
基于log转换后的数据设置colorbar刻度,让刻度文本显示原始数值:
import plotly.express as px import numpy as np import pandas as pd # 处理数据:替换0为NaN,计算log10值 df['log_value'] = np.log10(df['value'].replace(0, np.nan)) # 定义自定义刻度的原始值、显示文本,转换为log10数值用于对应color的刻度 original_ticks = [1E-22, 1E-10, 1E-9, 1E-8, 1E-7, 4.3E-06] tick_text = ["<1E-10", "1E-10", "1E-9", "1E-8", "1E-7", "4.3E-06"] log_ticks = np.log10(original_ticks) fig = px.choropleth(df, locations='locations', # 替换为你的国家代码/名称列 color='log_value', color_continuous_scale="YlOrRd", range_color=(log_ticks[0], log_ticks[-1]) # 锁定颜色范围 ) fig.update_layout(coloraxis_colorbar=dict( title="Value", tickvals=log_ticks, ticktext=tick_text, ticks="outside" )) fig.show()
进阶:自定义分箱(离散颜色)
如果想要实现预期图中的分段式离散颜色,可以先对原始数据做自定义分箱,再用离散颜色映射:
# 自定义分箱区间和标签 bins = [-np.inf, 1E-10, 1E-9, 1E-8, 1E-7, 4.3E-06, np.inf] labels = ["<1E-10", "1E-10~1E-9", "1E-9~1E-8", "1E-8~1E-7", "1E-7~4.3E-06", ">4.3E-06"] df['value_bin'] = pd.cut(df['value'].replace(0, np.nan), bins=bins, labels=labels) fig = px.choropleth(df, locations='locations', # 替换为你的国家代码/名称列 color='value_bin', color_discrete_sequence=px.colors.sequential.YlOrRd[:len(labels)], category_orders={"value_bin": labels} # 确保分箱顺序正确 ) fig.update_layout(coloraxis_colorbar=dict( title="Value" )) fig.show()
内容的提问来源于stack exchange,提问作者Natashaj
相关产品推荐
相关产品推荐

