【问题标题】:Adding geopandas boundary plot to plotly将 geopandas 边界图添加到 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。我尝试通过降低等值线图的不透明度来使用它,但它要么会覆盖散点图,要么几乎不可见。

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

【问题讨论】:

    标签: python plot plotly geopandas


    【解决方案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 文件而不是几何。这解决了它。
    猜你喜欢
    • 2020-05-10
    • 2021-02-22
    • 2019-08-08
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多