簡體   English   中英

Plotly express Choropleth Map 子圖不顯示所有內容

[英]Plotly express Choropleth Map subplot does not display everything

問題

為了按地區可視化選舉獲勝者的結果,我想在子圖中顯示 2 個等值線圖以比較第一輪和第二輪。

這是我的代碼的樣子:

import geopandas as gpd
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots

# Results
t1_dep = pd.read_csv('https://www.data.gouv.fr/fr/datasets/r/bf616688-8478-46fa-8abe-cd1cc1a53b83')

t1_dep.drop(t1_dep.columns[28:52], axis=1, inplace=True)
t1_dep.drop(t1_dep.columns[[3, 5, 6, 7, 8, 10, 11, 13, 14]], axis=1, inplace=True)

t1_dep.columns = ['Code Département','Département', 'Inscrits', 'Taux Abstention', 'Taux Blanc', 'Taux Nul', 'Taux Exprimé',
                  'ARTHAUD', 'ROUSSEL', 'MACRON', 'LASSALLE', 'LE PEN', 'ZEMMOUR', 'MÉLENCHON', 'HIDALGO', 'JADOT', 'PÉCRESSE', 'POUTOU', 'DUPONT-AIGNAN']

t2_dep = pd.read_csv('https://www.data.gouv.fr/fr/datasets/r/c7b72e78-5e78-4976-995f-30533f0a35d3')

t2_dep.drop(t2_dep.columns[18:52], axis=1, inplace=True)
t2_dep.drop(t2_dep.columns[[3, 5, 6, 7, 8, 10, 11, 13, 14]], axis=1, inplace=True)

t2_dep.columns = ['Code Département','Département', 'Inscrits', 'Taux Abstention', 'Taux Blanc', 'Taux Nul', 'Taux Exprimé',
                  'MACRON', 'LE PEN']

# Geo
geo_dep = gpd.read_file('https://www.data.gouv.fr/fr/datasets/r/92f37c92-3aae-452c-8af1-c77e6dd590e5')

for i in geo_dep.index[96:]:
    dep = geo_dep.loc[i, 'libgeo']
    code = geo_dep.loc[i, 'dep']
    
    t1_dep.loc[t1_dep['Département'] == dep, 'Code Département'] = code
    t2_dep.loc[t2_dep['Département'] == dep, 'Code Département'] = code
    
# Rounds winner per region
t1_vainq_dep = t1_dep[t1_dep.columns[7:]].idxmax(axis=1).to_frame(name='Vainqueur')
t1_vainq_dep['Code Département'] = t1_dep['Code Département']
t1_vainq_dep['Département'] = t1_dep['Département']

t2_vainq_dep = t2_dep[t2_dep.columns[7:]].idxmax(axis=1).to_frame(name='Vainqueur')
t2_vainq_dep['Code Département'] = t2_dep['Code Département']
t2_vainq_dep['Département'] = t2_dep['Département']
    
# Plot
fig_t1 = px.choropleth_mapbox(t1_vainq_dep,
                              locations='Code Département',
                              geojson=geo_dep,
                              color='Vainqueur',
                              featureidkey='properties.dep',
                              hover_name='Vainqueur')
fig_t2 = px.choropleth_mapbox(t2_vainq_dep,
                              locations='Code Département',
                              geojson=geo_dep,
                              color='Vainqueur',
                              featureidkey='properties.dep',
                              hover_name='Vainqueur')

fig = make_subplots(rows=1, cols=2,
                    subplot_titles=['Premier tour', 'Second tour'],
                    specs=[[{'type': 'choroplethmapbox'}, {'type': 'choroplethmapbox'}]])

fig.add_trace(fig_t1['data'][0], row=1, col=1)
fig.add_trace(fig_t2['data'][0], row=1, col=2)

fig.update_mapboxes(style='white-bg',
                    center={'lat': 46.3, 'lon': 1.6751},
                    zoom=4.2)
fig.update_layout(title_text='Élection Présidentielle 2022 - Vainqueur par département',
                  margin={'l': 0, 'r': 0, 't': 100, 'b': 0},
                  height=500)

fig.show()

在此處輸入圖像描述

這些地圖只顯示第一個候選人贏得的地區,而不是另一個,這不是由於數據問題,因為我可以分別正確地顯示每個 map。

我還使用類似的代碼正確地繪制了 2 個表示每個區域缺席率的地圖,沒有任何問題。 所以問題可能來自 plotly 必須找出每個候選顏色但不確定的事實。

有什么建議嗎?

我試過的

當我第一次查看如何創建子圖時,plotly 文檔顯示了使用圖 Object 的示例,因為 Express 不“支持”子圖。

我沒有 go 的唯一原因是,我不知道為什么,但是 go.Choropleth map 不喜歡我的 GeoJson(即使在使用 to_json() 解析之后)並在 Jupyter 中顯示一條很長的錯誤消息筆記本控制台。

因此,我設法找到了能夠將 Express 圖轉移到子圖的解決方法。

重用 plotly.express 數據是重用數據的常用方法,但由於某些原因,它在這種情況下不起作用。 我也不清楚原因。 作為解決方法,您可以將候選 ID 添加為數字,並為這些 ID 指定 colors 以繪制 map。

import geopandas as gpd
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
from urllib import request
import json

# Results
t1_dep = pd.read_csv('https://www.data.gouv.fr/fr/datasets/r/bf616688-8478-46fa-8abe-cd1cc1a53b83')

t1_dep.drop(t1_dep.columns[28:52], axis=1, inplace=True)
t1_dep.drop(t1_dep.columns[[3, 5, 6, 7, 8, 10, 11, 13, 14]], axis=1, inplace=True)

t1_dep.columns = ['Code Département','Département', 'Inscrits', 'Taux Abstention', 'Taux Blanc', 'Taux Nul', 'Taux Exprimé',
                  'ARTHAUD', 'ROUSSEL', 'MACRON', 'LASSALLE', 'LE PEN', 'ZEMMOUR', 'MÉLENCHON', 'HIDALGO', 'JADOT', 'PÉCRESSE', 'POUTOU', 'DUPONT-AIGNAN']

t2_dep = pd.read_csv('https://www.data.gouv.fr/fr/datasets/r/c7b72e78-5e78-4976-995f-30533f0a35d3')

t2_dep.drop(t2_dep.columns[18:52], axis=1, inplace=True)
t2_dep.drop(t2_dep.columns[[3, 5, 6, 7, 8, 10, 11, 13, 14]], axis=1, inplace=True)

t2_dep.columns = ['Code Département','Département', 'Inscrits', 'Taux Abstention', 'Taux Blanc', 'Taux Nul', 'Taux Exprimé',
                  'MACRON', 'LE PEN']

with request.urlopen('https://www.data.gouv.fr/fr/datasets/r/92f37c92-3aae-452c-8af1-c77e6dd590e5') as f:
    geo_dep = json.load(f)

# Rounds winner per region
t1_vainq_dep = t1_dep[t1_dep.columns[7:]].idxmax(axis=1).to_frame(name='Vainqueur')
t1_vainq_dep['Code Département'] = t1_dep['Code Département']
t1_vainq_dep['Département'] = t1_dep['Département']
t1_vainq_dep['Vainqueur_id'] = t1_vainq_dep['Vainqueur'].map({'MACRON':0, 'LE PEN':1, 'MÉLENCHON':2})

t2_vainq_dep = t2_dep[t2_dep.columns[7:]].idxmax(axis=1).to_frame(name='Vainqueur')
t2_vainq_dep['Code Département'] = t2_dep['Code Département']
t2_vainq_dep['Département'] = t2_dep['Département']
t2_vainq_dep['Vainqueur_id'] = t2_vainq_dep['Vainqueur'].map({'MACRON':0, 'LE PEN':1})

# Plot
fig_t1 = px.choropleth_mapbox(t1_vainq_dep,
                              locations='Code Département',
                              geojson=geo_dep,
                              color='Vainqueur_id',
                              featureidkey='properties.dep',
                              hover_name='Vainqueur')
fig_t2 = px.choropleth_mapbox(t2_vainq_dep,
                              locations='Code Département',
                              geojson=geo_dep,
                              color='Vainqueur_id',
                              featureidkey='properties.dep',
                              hover_name='Vainqueur')

fig = make_subplots(rows=1, cols=2,
                    subplot_titles=['Premier tour', 'Second tour'],
                    specs=[[{'type': 'choroplethmapbox'}, {'type': 'choroplethmapbox'}]])

fig.add_trace(fig_t1['data'][0], row=1, col=1)
fig.add_trace(fig_t2['data'][0], row=1, col=2)

fig.update_layout(coloraxis_showscale=False) # update

fig.update_mapboxes(style='white-bg',
                    center={'lat': 46.3, 'lon': 1.6751},
                    zoom=4.2)
fig.update_layout(title_text='Élection Présidentielle 2022 - Vainqueur par département',
                  margin={'l': 0, 'r': 0, 't': 100, 'b': 0},
                  height=500)

fig.show()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM