使用GeoJSON绘制英格兰地方当局Plotly Choropleth地图渲染异常
故障原因
你遇到的渲染异常由三个配置错误共同导致:
scope="europe"参数误用:该参数仅对Plotly官方内置的预制行政边界生效,加载自定义GeoJSON时调用会强制套用内置欧洲区域的坐标系和视图逻辑,和你导入的英国地方当局边界坐标不兼容- 缺少边界自适应配置:使用自定义GeoJSON绘图必须显式设置
fitbounds="locations",否则Plotly默认加载全球尺度视图,你导入的小面积行政区会被压缩成无法分辨边界的聚合色块 - 色阶范围设置不合理:你的测试数据
Val列取值为0到地方当局总序号(英国该级行政区共300+个),但你硬编码range_color=(0, 12),所有取值大于12的区域都会被渲染为色阶顶端的明黄色,完全看不到分区数值差异。
你给GeoJSON要素注入id字段、关联DataFrame的逻辑是正确的,不需要调整。
修复后可直接运行的代码
from urllib.request import urlopen import json import pandas as pd import plotly.express as px # 加载本地GeoJSON文件 with urlopen('file:///Users/thomasvalentine/Downloads/Local_Authority_Districts_(December_2021)_GB_BFC.json') as response: Local_authorities = json.load(response) la_data = [] # 遍历GeoJSON为每个要素注入匹配用id,同时生成测试数据 for i in range(len(Local_authorities["features"])): la_name = Local_authorities["features"][i]['properties']['LAD21NM'] Local_authorities["features"][i]['id'] = la_name la_data.append([la_name, i]) # 构造测试DataFrame df = pd.DataFrame(la_data, columns=['LA', 'Val']) # 绘制等值区域图 fig = px.choropleth( df, geojson=Local_authorities, locations='LA', color='Val', color_continuous_scale="Viridis", fitbounds="locations", # 自动缩放到自定义GeoJSON的边界范围 range_color=(0, df['Val'].max()), # 色阶匹配实际数据范围 labels={'Val': 'value'} ) # 关闭默认的世界底图,移除多余边距 fig.update_geos(visible=False) fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0}) fig.show()
可选优化
如果需要叠加道路、地名等常规地图底图,可以将px.choropleth替换为px.choropleth_mapbox,配置个人Mapbox Token即可,GeoJSON和DataFrame的关联逻辑不需要改动,视图自适应、色阶配置参数完全通用。
内容的提问来源于stack exchange,提问作者eggy_snaps
相关产品推荐
相关产品推荐

