提问人:Nicolas 提问时间:10/30/2023 最后编辑:Nicolas 更新时间:11/2/2023 访问量:48
情节分区统计组:处理多边形和边界的并集
Plotly choropleth : deal with union of polygons and borders
问:
我正在尝试制作法国城市的分区统计图(这意味着按比例为城市着色)。但是,我想加强部门的边界(这是城市的connex union)
我设法创建了一个包含城市和部门的 geo-json 文件(作为城市多边形与 Shapely 库的合并)。geo-json 字典包含特征(每个多边形都有一个唯一的 properties.code:department 像 '76',城市像 '76000' 作为字符串)
我想给城市(通过Choropeth)和边境部门(颜色为空或不透明度= 0)着色。多亏了第一个答案,我尝试了下面的代码,但它不起作用(要么我给城市上色并获取它们的边界,要么我给城市和部门上色(填充了“val”)并将它们全部着色,但部门隐藏了城市)
list_rnd = np.random.randint(0,100,size=len(set_commune))
df_commune = pd.DataFrame({'code':list(set_commune), 'val':list_rnd})
df_commune['dept'] = df_commune.code.map(lambda x:x[:2])
df_commune['lineWidth'] = 1
df_commune['lineColor'] = 'grey'
df_dept = pd.DataFrame({'code':['27', '76'], 'val':None})
df_dept['lineWidth'] = 3
df_dept['lineColor'] = 'red'
df_total = pd.concat([ df_commune, df_dept])
fig = go.Figure(data=go.Choropleth(
geojson=geojson_all_levels,
locations=df_total['code'],
z=df_total['val'].astype(float),
featureidkey='properties.code',
colorscale='Viridis',
colorbar_title='Nombre de demandes',
marker_line_width=df_total['lineWidth'],
marker_line_color=df_total['lineColor'],
))
我也听说过updated_traces但没有让它起作用
答:
1赞
r-beginners
10/31/2023
#1
作为地图的自定义,突出显示特定边界的方法需要使用图形对象。由于您的问题没有提供 geojson 数据,因此我创建了更合适的示例数据,取自此处。我为县总数创建了一个线宽列表,为线条颜色创建了一个颜色列表,并且我更改了一些标记的线宽和线条颜色,但我使用了 featureidkey='properties.code',因为我需要将其与 geojson 相关联,但您的 geojson 数据在 geojson 数据中使用“properties.id”。
编辑:问题已更正,代码已修改。
您需要更新特定区域的行数据,例如 .您正在向 ...如果数据值为 None,则不会绘制它,包括边界,因此我使用了适当的负值。.iloc
import plotly.graph_objects as go
from urllib import request
import json
import pandas as pd
import numpy as np
np.random.seed(1)
url = 'https://raw.githubusercontent.com/gregoiredavid/france-geojson/master/departements-version-simplifiee.geojson'
with request.urlopen(url) as f:
fr_departments = json.load(f)
departments = []
for i in range(len(fr_departments['features'])):
department = fr_departments['features'][i]['properties']
departments.append([department['code'], department['nom']])
df = pd.DataFrame(departments, columns=['code','nom'])
list_rnd = np.random.randint(0,100,size=len(df))
df_commune = pd.DataFrame({'code':df['code'].tolist(), 'val':list_rnd})
df_commune['dept'] = df_commune.code.map(lambda x:x[:2])
df_commune['lineWidth'] = 1
df_commune['lineColor'] = 'grey'
update_data1 = ['27', -10, 27, 3, 'red']
update_data2 = ['76', -10, 76, 3, 'red']
df_commune.iloc[25] = update_data1
df_commune.iloc[76] = update_data2
df_total = df_commune.copy()
fig = go.Figure(data=go.Choropleth(
geojson=fr_departments,
locations=df_total['code'],
z=df_total['val'].astype(float),
featureidkey='properties.code',
colorscale='Viridis',
colorbar_title='Nombre de demandes',
marker_line_width=df_total['lineWidth'],
marker_line_color=df_total['lineColor'],
))
fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(height=500)
fig.show()
评论
0赞
Nicolas
11/2/2023
非常感谢这个开始解决方案的答案。尽管如此,我还没有工作。多亏了您的帮助,我编辑了我的问题以更新我的尝试
0赞
r-beginners
11/2/2023
以下问题也已经发布,我的回答是否帮助您解决了问题?看这个。
评论