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

时间:2020-03-23 14:42:47

标签: python geojson plotly-dash choropleth

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

我使用其他工具测试了geojson,在该工具中,地图绘制正确,但没有使用Choroplethmapbox

关于我在做什么错的任何想法吗?

谢谢

GeoJson:

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

Python Dash代码:

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

4 个答案:

答案 0 :(得分:3)

看起来像您缺少底部的 fig.show(),而顶部却直接导入了plotly.graph_objects 。下面的代码将打开一个地图,但是需要为Choropleth值提供数据。您的代码示例中有df,但没有包含csv。如果需要我们代码中的df,请导入熊猫,然后从csv创建一个名为df的数据框。这是一个可以帮助您的链接。 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()

以下是在您的json中使用熊猫的示例。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()

答案 1 :(得分:2)

我需要添加一个带有以下代码的ID:

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

答案 2 :(得分:1)

我必须解决一个类似的问题,这是我应用于您的问题的解决方案(尽管使用 px.choropleth_mapbox 而不是我发现对等值线感到困惑的 graph_objects)。

  • 您链接的数据没有(至少在撰写本文时没有)列“Enero”。
  • 我没有墨西哥各县的 GeoJSON。
  • 您永远不会定义 Dash 应用程序 (app.layout = ...),而您可能没有它就可以提供服务,并且只按照建议使用 fig.show(),显式节拍隐式。因此,最好创建一个布局部分。
  • 如果我理解它是如何工作的,如果您使用 GeoPandas,您不必按照您在自己的答案中建议的那样生成和“id”或类似的东西。

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

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 启动服务的开发,启动网络浏览器,导航到它使用的 url(它写在终端,通常是 172.0.0.1:8050)给你这个:

enter image description here

我正在从默认的 anaconda 频道运行这些版本。

  • 破折号 1.19.0
  • dash-core-components 1.3.1
  • dash-html-components 1.0.1
  • 破折号渲染器 1.1.2
  • 烧瓶 1.1.2
  • geopandas 0.8.1

附注。我实际上使用这些数据来询问有关 dash choropleth mapbox 选择行为 (Selection behavior in plotly-dash Choropleth mapbox plot) 的问题。谢谢!

答案 3 :(得分:0)

我有类似的问题。使用show方法,它可以正常工作,有时也可以使用破折号(仅使用回调)。出现问题的原因是破折号的真正旧版本,是通过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