带有 Choroplethmapbox 的地图未显示在 Dash 中

Map with Choroplethmapbox isn't showing in Dash

我正在尝试在 Dash 中使用 Choroplethmapbox 构建地图,但我无法在其中绘图。

我用另一个工具测试了 geojson,在那个工具中,地图绘制正确,但 Choroplethmapbox

知道我做错了什么吗?

谢谢

GeoJson:

https://gist.github.com/Tlaloc-Es/5c82834e5e4a9019a91123cb11f598c0

Python 破折号:

import json
with open('mexico.geojson') as f:
    counties = json.load(f)
fig = go.Figure(go.Choroplethmapbox(
    geojson=counties,
    locations=df['COV_'],
    z=df['Enero'],
    colorscale="Viridis", zmin=0, zmax=df['Enero'].max(),
    marker_opacity=0.5, marker_line_width=0))

fig.update_layout(mapbox_style="carto-positron",
                  mapbox_zoom=3, mapbox_center = {"lat": 37.0902, "lon": -95.7129})
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})

您似乎缺少底部的 fig.show()import plotly.graph_objects as go在顶部。下面的代码将打开一张地图,但等值线值需要数据。您的代码示例中有 df 但没有包含 csv。如果您想使用代码中的 df,请导入 pandas,并从 csv 创建一个名为 df 的数据框。这里有一个 link 可以帮助解决这个问题。 Pandas dataframes

import json
import plotly.graph_objects as go


with open(r'{insert file path here}.geojson') as f:
    counties = json.load(f)
fig = go.Figure(go.Choroplethmapbox(
    geojson=counties,
    colorscale="Viridis", zmin=0, zmax=100,
    marker_opacity=0.5, marker_line_width=0))

fig.update_layout(mapbox_style="carto-positron",
                  mapbox_zoom=3, mapbox_center = {"lat": 37.0902, "lon": -95.7129})
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

这里有一个使用pandas的例子json.Further可以找到下面代码的解释here

from urllib.request import urlopen
import json
with urlopen('https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json') as response:
    counties = json.load(response)

import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv",
                   dtype={"fips": str})

import plotly.express as px

fig = px.choropleth(df, geojson=counties, locations='fips', color='unemp',
                           color_continuous_scale="Viridis",
                           range_color=(0, 12),
                           scope="usa",
                           labels={'unemp':'unemployment rate'}
                          )
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

我需要使用以下代码添加一个 id 字段:

我使用了这个页面的代码:https://community.plot.ly/t/plot-a-shapefile-shp-in-a-choropleth-chart/27850

我也有类似的问题。使用 show 方法,它工作正常,有时也使用破折号(仅使用回调)。问题的发生是由于 dash 的真正旧版本,通过 anaconda 的默认通道安装(只有一个版本 1.4.1)。通过 conda-forge 频道更新版本(在我的例子中是 1.13.4)安装后它可以工作。

conda install -c conda-forge dash dash-core-components \
                 dash-html-components dash-renderer dash-table 

我不得不解决一个类似的问题,这是我应用于您的问题的解决方案(尽管使用 px.choropleth_mapbox 而不是 graph_objects,我发现这让等值线混淆)。

  • 您 link 的数据(至少在撰写本文时没有)包含 'Enero'.
  • 您永远不会定义 Dash 应用程序 (app.layout = ...),虽然您可以在没有它的情况下提供服务,只需按照建议使用 fig.show(),显式胜于隐式。因此创建一个布局部分更好。
  • 如果我理解它是如何工作的,如果您使用 GeoPandas,您 不必 生成 'id' 或您在自己的答案中建议的任何类似内容。

无论如何,希望我的解决方案可以作为您工作的开始。我添加了单选按钮,以便您可以 select 将哪些数据列用于颜色。

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
import plotly.express as px

import geopandas as gpd

print('Loading data...')
gdf = gpd.read_file('https://gist.githubusercontent.com/Tlaloc-Es/5c82834e5e4a9019a91123cb11f598c0/raw/709ce9126861ef7a7c7cc4afd6216a6750d4bbe1/mexico.geojson')
gdf = gdf.to_crs(epsg=4326)

print('Done!')
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    html.Div([
                dcc.RadioItems(
                    id='radio-color_on',
                    options=[{'label': i, 'value': i} for i in ['AREA','PERIMETER']],
                    value='AREA',
                    labelStyle={'display': 'inline-block'}
                ),
    ],style={'width': '40%', 'display': 'inline-block',}),

html.Div([], style={'width':'100%'}),

    html.Div([
                dcc.Graph(id="fig")
    ],style={'width': '100%', 'display': 'inline-block', 'padding': '0 10',},),
]) 

@app.callback(
    Output("fig", "figure"), 
    [Input("radio-color_on", "value")])
def draw_choropleth(color_on):
    fig = px.choropleth_mapbox(gdf, 
                            geojson=gdf.geometry, 
                            locations=gdf.index, 
                            color=color_on,
                            color_continuous_scale="Viridis",
                            #range_color=(0, 12),
                            mapbox_style="carto-positron",
                            zoom=4, 
                            center = {"lat":gdf.centroid.y.mean(), "lon":gdf.centroid.x.mean()},
                            opacity=0.5,
                            )
    fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0},
                        height=700,
                        )
    
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

将此代码保存到文件“myapp.py”并在终端中 运行 作为 python myapp.py 启动开发服务,启动网络浏览器,导航到 [=它使用的 61=](它在终端中写出来,通常是 172.0.0.1:8050)给你这个:

我是运行这些版本,来自默认的anaconda频道。

  • 破折号 1.19.0
  • dash-核心组件 1.3.1
  • 破折号-html-组件 1.0.1
  • 破折号渲染器 1.1.2
  • 烧瓶 1.1.2
  • geopandas 0.8.1

PS。我实际上使用这些数据来问一个关于 dash choropleth mapbox selection behavior (Selection behavior in plotly-dash Choropleth mapbox plot) 的问题。谢谢!