带有 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) 的问题。谢谢!
我正在尝试在 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) 的问题。谢谢!