Plotly Express地图颜色分配逻辑咨询:Severity字段着色疑问
问题原因与解决方法
颜色分配逻辑
当你的数据集里同一个FIPS(即地图上的单个区域)对应多条事故记录时,Plotly Express的choropleth_mapbox不会自动对该区域的color字段做聚合计算,而是直接取该FIPS分组下的最后一条记录的Severity值来给区域着色。这就是为什么FIPS 36021显示为Severity=4——只是该区域最后一条事故记录的Severity是4,和整体统计值无关。
解决步骤
要实现按区域的Severity统计值(平均值、中位数等)着色,必须先对原始数据按FIPS分组聚合,再用聚合后的数据集绘图:
聚合原始数据
使用pandas对数据按FIPS分组,计算每个区域的Severity统计值(这里以平均值为例,你也可以换成中位数、总和等):import pandas as pd # 按FIPS分组,计算Severity的平均值,重置索引生成新数据集 agg_data = data.groupby('FIPS')['Severity'].mean().reset_index() # 如果需要中位数,替换成:.median()用聚合数据绘制地图
把聚合后的数据集传入px.choropleth_mapbox,此时color参数对应聚合后的Severity统计列:import plotly.express as px fig = px.choropleth_mapbox( agg_data, geojson=counties, locations='FIPS', mapbox_style="open-street-map", color="Severity", # 这里使用聚合后的统计值 zoom=6, center=dict(lat=42.8, lon=-75.3), height=800, width=1200, opacity=0.5, color_continuous_scale="Viridis" # 可选,自定义颜色刻度 ) fig.show()
为什么color=np.median(data['Severity'])无效?
color参数需要指定数据集中的列名,让Plotly能将每个区域(FIPS)对应到该列的具体数值。而你传入的是整个数据集的中位数(单一数值),Plotly无法将这个值匹配到每个区域,因此无法实现预期效果。
内容的提问来源于stack exchange,提问作者afroduck
相关产品推荐
相关产品推荐

