将 geopandas 边界图添加到 plotly

Posted

技术标签:

【中文标题】将 geopandas 边界图添加到 plotly【英文标题】:Adding geopandas boundary plot to plotly 【发布时间】:2021-10-23 02:33:42 【问题描述】:

我有两个独立的地图,一个是一个国家的文化边界(就像州边界一样),以基于纬度和经度值的自定义多边形的形式,以 geojson 格式定义。我可以使用 geopandas 轻松绘制多边形:

states = gpd.read_file('myfile.geojson')
states.boundary.plot()

这是一个示例输出:

第二个是一系列纬度和经度以及我需要在地图图层上绘制的相应值,我可以使用 plotly express 的 scatter_mapbox 来完成:

fig = px.scatter_mapbox(df_year,
                        lat='y', lon='x',
                        color='drought_index',
                        range_color=(-4, 4),
                        hover_data='x': False, 'y': False,
                        zoom=5, height=800, width=1050,
                        center='lat': 32.7089, 'lon': 53.6880,
                        color_continuous_scale=px.colors.diverging.RdYlGn,
                        color_continuous_midpoint=0,
                        )
fig.update_layout(mapbox_style="outdoors", mapbox_accesstoken=mb_token)

看起来像这样:

有没有办法将这两个图加在一起,让散点和形状边界在一张地图上重叠?这意味着在 mapbox 层的顶部,我可以看到散点和多边形的边界。

问题是 geopandas plot 使用 matplotlib 并 returens AxesSubplot:,我找不到任何方法将它添加到 plotly 图中。我尝试了 plotly.tools 中的 mpl_to_plotly(),但它在“Canvas is null”上引发了异常。

我还试图找到一种方法来绘制 geojson 形状的 plotly,但我能找到的只是需要用颜色填充形状的 choropleth mapbox。我尝试通过降低等值线图的不透明度来使用它,但它要么会覆盖散点图,要么几乎不可见。

感谢任何有关如何解决此问题的建议。

【问题讨论】:

【参考方案1】: 您确实描述了解决方案。 https://plotly.com/python/mapbox-layers/ 已将英国县边界用作文化图层 已使用英国医院生成散点图框 "source": json.loads(gdf.geometry.to_json()), 确实是从 geopandas 数据框添加 GEOJSON 层的解决方案
import requests
import geopandas as gpd
import pandas as pd
import json, io
import plotly.express as px

# UK admin area boundaries
res = requests.get("https://opendata.arcgis.com/datasets/69dc11c7386943b4ad8893c45648b1e1_0.geojson")

# geopandas dataframe of "cultural layer"
gdf = gpd.GeoDataFrame.from_features(res.json()["features"], crs="CRS84")

# get some public addressess - hospitals.  data that can be scattered
dfhos = pd.read_csv(io.StringIO(requests.get("http://media.nhschoices.nhs.uk/data/foi/Hospital.csv").text),
    sep="¬",engine="python",)


fig = (
    px.scatter_mapbox(
        dfhos.head(100),
        lat="Latitude",
        lon="Longitude",
        color="Sector",
        hover_data=["OrganisationName", "Postcode"],
    )
    .update_traces(marker="size": 10)
    .update_layout(
        mapbox=
            "style": "open-street-map",
            "zoom": 5,
            "layers": [
                
                    "source": json.loads(gdf.geometry.to_json()),
                    "below": "traces",
                    "type": "line",
                    "color": "purple",
                    "line": "width": 1.5,
                
            ],
        ,
        margin="l": 0, "r": 0, "t": 0, "b": 0,
    )
)
fig.show()

【讨论】:

谢谢一百万。在尝试相同的解决方案时,我在 '"source": json.loads(gdf.geometry.to_json())' 部分犯了一个错误,我使用了整个 geojson 文件而不是几何。这解决了它。

以上是关于将 geopandas 边界图添加到 plotly的主要内容,如果未能解决你的问题,请参考以下文章

在带有子图的 geopandas 图中添加图例会改变图的大小

R语言plotly可视化:可视化箱图数据点自定义设置箱图中数据点的显示方式添加抖动数据点无异常数据点(whisker轴须边界包含所有数据)可疑异常值为数据点异常值为数据点(outlier)

Plotly:如何使用 DASH 回调将多项式拟合线添加到 plotly go.scatter 图?

将垂直线段添加到动态条形图 ggplot-plotly

R语言可视化散点图(scatter plot)图允许数据和标签堆叠允许标签在图像边界截断允许标签超出图像边界ggrepel包来帮忙

使用 R 和 ggplot2 语法将自定义工具提示添加到 plotly