情节分区统计组:处理多边形和边界的并集

Plotly choropleth : deal with union of polygons and borders

提问人:Nicolas 提问时间:10/30/2023 最后编辑:Nicolas 更新时间:11/2/2023 访问量:48

问:

我正在尝试制作法国城市的分区统计图(这意味着按比例为城市着色)。但是,我想加强部门的边界(这是城市的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但没有让它起作用

Python 绘图 等值统计

评论


答:

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()

enter image description here

评论

0赞 Nicolas 11/2/2023
非常感谢这个开始解决方案的答案。尽管如此,我还没有工作。多亏了您的帮助,我编辑了我的问题以更新我的尝试
0赞 r-beginners 11/2/2023
以下问题也已经发布,我的回答是否帮助您解决了问题?看这个