如何在Plotly Choropleth地图中为两个CSV数据集指定固定色条数值?
嘿,我完全懂你现在的困扰——用Plotly画美国各州两类工作的Choropleth地图时,默认色条会自动适配每个数据集的数值范围,哪怕两类工作的计数差异很大,地图视觉上却看起来差不多,根本没法直观对比它们和各州的关联情况。别担心,咱们可以通过固定色条的全局数值范围或者自定义区间刻度来解决这个问题,下面给你具体的实现方法:
方案1:固定色条的全局数值范围(最适合直接对比)
这个方法的核心是让两张地图共享完全相同的色阶范围,这样颜色深浅就能直接对应数值大小,对比起来一目了然。步骤如下:
- 先计算两个数据集的全局最小值和最大值,确保色条范围覆盖所有可能的数值;
- 在绘制每个Choropleth地图时,用
range_color参数(Plotly Express)或zmin/zmax参数(Plotly Graph Objects)固定色条范围。
代码示例(Plotly Express版本)
假设你有两个存储工作数据的DataFrame:df_job1和df_job2,都包含state(美国州缩写)和count(工作计数)列:
import plotly.express as px # 计算两类工作数据的全局极值,确保色条范围覆盖所有数值 global_min = min(df_job1['count'].min(), df_job2['count'].min()) global_max = max(df_job1['count'].max(), df_job2['count'].max()) # 绘制第一类工作的地图,固定色条范围 fig1 = px.choropleth( df_job1, locations='state', locationmode='USA-states', color='count', scope='usa', title='美国各州第一类工作分布', color_continuous_scale='Blues', range_color=(global_min, global_max) # 固定色条上下限 ) # 绘制第二类工作的地图,使用完全相同的色条范围 fig2 = px.choropleth( df_job2, locations='state', locationmode='USA-states', color='count', scope='usa', title='美国各州第二类工作分布', color_continuous_scale='Blues', range_color=(global_min, global_max) # 和第一张图保持一致 ) # 显示两张图 fig1.show() fig2.show()
方案2:自定义色条的区间刻度(突出特定范围)
如果你的数据有明确的区间划分(比如0-100、100-200等),或者想突出某些数值范围,可以自定义色条的刻度值和显示文本,同时配合固定的色条范围。
代码示例
import plotly.express as px # 先固定色条的全局范围(和方案1一致) global_min = min(df_job1['count'].min(), df_job2['count'].min()) global_max = max(df_job1['count'].max(), df_job2['count'].max()) # 自定义刻度值和对应的显示文本 custom_tickvals = [global_min, (global_min+global_max)//2, global_max] custom_ticktext = ['低', '中', '高'] # 或者用具体数值,比如['0', '250', '500'] # 绘制地图并设置自定义刻度 fig = px.choropleth( df_job1, locations='state', locationmode='USA-states', color='count', scope='usa', title='美国各州第一类工作分布', color_continuous_scale='Reds', range_color=(global_min, global_max) ) # 更新色条的刻度配置 fig.update_layout( coloraxis_colorbar=dict( tickvals=custom_tickvals, ticktext=custom_ticktext, title='工作数量' ) ) fig.show()
进阶技巧:并排显示两张地图并共享色条
如果你想让对比更直观,可以用make_subplots把两张地图放在同一个画布上,共享同一个色条:
from plotly.subplots import make_subplots import plotly.graph_objects as go # 计算全局极值 global_min = min(df_job1['count'].min(), df_job2['count'].min()) global_max = max(df_job1['count'].max(), df_job2['count'].max()) # 创建子图布局 fig = make_subplots( rows=1, cols=2, subplot_titles=('第一类工作', '第二类工作'), specs=[[{'type': 'choropleth'}, {'type': 'choropleth'}]] ) # 添加第一张地图(显示色条) fig.add_trace( go.Choropleth( locations=df_job1['state'], z=df_job1['count'], locationmode='USA-states', colorscale='Blues', zmin=global_min, zmax=global_max, colorbar=dict(title='工作数量', x=0.5) # 色条放在两张图中间 ), row=1, col=1 ) # 添加第二张地图(不显示色条,共享第一张的范围) fig.add_trace( go.Choropleth( locations=df_job2['state'], z=df_job2['count'], locationmode='USA-states', colorscale='Blues', zmin=global_min, zmax=global_max, showscale=False ), row=1, col=2 ) # 设置美国地图范围 fig.update_layout(geo_scope='usa') fig.show()
这样处理后,两张地图的颜色深浅就能准确反映数值差异,你可以清晰对比两类工作在美国各州的分布关联啦!
内容的提问来源于stack exchange,提问作者saad
相关产品推荐
相关产品推荐

