【问题标题】:How to put a Geopandas plot on top of a matplotlib pyplot image?如何将 Geopandas 图放在 matplotlib pyplot 图像之上?
【发布时间】:2021-10-21 06:28:04
【问题描述】:

目前,我有一个来自 cartopy 的某个地理区域的图,我有一个从 Geopandas 绘制的几何对象,但无论我做什么,我都无法将它们组合成一个图。两者的轴相同,我实际上可以将几何对象的轴放到地理区域上,但随后我的形状消失了。

这里是相关的代码部分:

from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import cartopy.io.img_tiles as cimgt
import geopandas as gpd   
from matplotlib import pyplot as plt   
                
                
# Plotting the trade area graph
trade_geo_df = trade_area_response.json()['data']
trade_geo_df = gpd.GeoDataFrame(trade_geo_df)
trade_geo_df.loc[:, 'coordinates'] = trade_geo_df.coordinates.map(lambda x: x[0])
trade_geo_df['geometry'] = trade_geo_df.coordinates.apply(shapely.geometry.Polygon)
trade_geo_df['geometry'].plot()   
plt.plot(placer_lng, placer_lat, markersize=2, marker='o', color='red')  # Just a red dot

fig = plt.figure()
stamen_terrain = cimgt.Stamen('terrain-background')
        
# Limit the extent of the map to a small longitude/latitude range
ax = fig.add_subplot(1, 1, 1, projection=stamen_terrain.crs)
ax.set_extent([-89, -86, 41, 43], crs=ccrs.Geodetic())
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--')
gl.ylabels_right = False
gl.xlabels_top = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlabel_style = {'size': 10, 'color': 'gray'}
gl.ylabel_style = {'size': 10, 'color': 'gray'}
            
ax.add_image(stamen_terrain, 8)
            
ax.plot(placer_lng, placer_lat, markersize=2, marker='o', color='red', transform=ccrs.Geodetic())  # Just another red dot
plt.show()

更多信息,以下是代码块中提到的trade_geo_df['geometry']

Out[4]: 
0    POLYGON ((-87.94035 41.93909, -87.93965 41.939...
1    POLYGON ((-87.88849 42.01734, -87.88676 42.016...
2    POLYGON ((-87.92825 42.02102, -87.92652 42.020...
3    POLYGON ((-87.86428 42.04548, -87.86255 42.045...
4    POLYGON ((-87.86947 42.05987, -87.86774 42.059...
5    POLYGON ((-87.87466 42.08422, -87.87293 42.084...
6    POLYGON ((-88.03025 42.10923, -88.02852 42.109...
7    POLYGON ((-88.01296 42.10972, -88.01123 42.109...
8    POLYGON ((-87.90750 42.12355, -87.90577 42.123...
9    POLYGON ((-88.01296 42.13131, -88.01123 42.130...
Name: geometry, dtype: geometry

最后是出现的两个数字。它们具有相同的轴,我只是想让它们在一个图形上对齐(红点在两者的相同位置,但我知道我缺少一些东西。

我尝试将几何对象的轴设置为与地理图像相同,将它们变成同一图形的子图,切换 zorder 并将它们放在同一图形中,等等,但似乎没有去工作。我没有太多的绘图经验,因此将不胜感激。

【问题讨论】:

    标签: python matplotlib plot geopandas cartopy


    【解决方案1】:

    我将您的代码行重新排列到适当的位置,并在必要时添加/更正了投影数据。不相关的行被注释掉。最后,这是您可以尝试的结果代码。

    from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
    import cartopy.io.img_tiles as cimgt
    import geopandas as gpd   
    from matplotlib import pyplot as plt  
    import cartopy.crs as ccrs
    
    stamen_terrain = cimgt.Stamen('terrain-background')
    fig, ax = plt.subplots(figsize=(8,6), subplot_kw={'projection': stamen_terrain.crs})
    
    ax.set_extent([-89, -86, 41, 43], crs=ccrs.PlateCarree())
    
    # Plotting the trade area graph
    #trade_geo_df = trade_area_response.json()['data']
    #trade_geo_df = gpd.GeoDataFrame(trade_geo_df)
    #trade_geo_df.loc[:, 'coordinates'] = trade_geo_df.coordinates.map(lambda x: x[0])
    #trade_geo_df['geometry'] = trade_geo_df.coordinates.apply(shapely.geometry.Polygon)
    #trade_geo_df['geometry'].plot(ax=ax)   
    ax.plot(-87, 42, markersize=20, marker='o', color='red', transform=ccrs.PlateCarree(), zorder=100)  # Just a red dot
    
    gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=2, color='gray', alpha=0.5, linestyle='--')
    gl.ylabels_right = False
    gl.xlabels_top = False
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    gl.xlabel_style = {'size': 10, 'color': 'gray'}
    gl.ylabel_style = {'size': 10, 'color': 'gray'}
    
    ax.add_image(stamen_terrain, 8)
    #ax.plot(placer_lng, placer_lat, markersize=2, marker='o', color='red', transform=ccrs.Geodetic())  # Just another red dot
    plt.show()
    

    输出:-

    【讨论】:

    • 非常感谢您的回复。请问您为什么评论了trade_geo_df['geometry']?这会带来我需要覆盖在您显示为输出的地图顶部的多边形。
    • 我避免接触涉及“您的”数据的部分(您是否提供了对它们的完全访问权限?)。您应该取消注释代码并运行,然后告诉我它是否适用于您的环境?请注意在注释行之一中使用 .plot(ax=ax) 。这会将您的数据绘制在同一个公共地图/轴上。但是,正如我所见,您的数据需要设置 CRS 以与带有 .to_crs(stamen_terrain.crs, inplace=True) 的底图/plot_axis 匹配。我希望一切顺利。请尽快提供反馈,以便我和这里的人可以进一步帮助您。
    • 有道理,非常感谢。我没有提供对涉及几何的部分的完全访问权限,因为需要付费 API 来检索它。当我用注释掉的行运行代码时,我得到与你相同的输出,但不幸的是,当我取消注释它们以添加几何图形时,背景消失了,我只剩下这些轴上的一个红点和一个白色背景而不是重叠的两个数字。
    • @DomM 将来,当有人(包括您)发布更好的答案时,您可以在此处撤消您的决定并改为接受该决定。请记住,如果不访问所有必要的依赖项,没有人可以 100% 帮助您。
    • AFAIK 没有违反规则。谢谢。
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多