Geopandas 在更改 crs 并使用 fig,ax 绘图时绘图为空(没有 fig,ax 一切都很好)?

Geopandas plot empty when changing crs and plotting with fig,ax (without fig,ax everything is fine)?

将 matplotlib 中的 fig,ax 与 geopandas 数据框结合使用并且更改 .crs 时,绘图为空。有人知道为什么会发生这种情况以及如何解决吗?

数据集:https://hub.arcgis.com/datasets/esribeluxdata::belgium-municipalities-1

import geopandas as gpd
import matplotlib.pyplot as plt
from fiona.crs import from_epsg

belgium = gpd.read_file("BELGIUM__Municipalities.shp")

fig,ax = plt.subplots()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

municipalities.plot(ax = ax) -> crs=WGS84 (lat/long)
plt.show()

municipalities = municipaliteis.to_crs("epsg:3395") -> crs to Mercator projection
municipalities.crs
municipalities.plot(ax = ax) -> plot = empty: Why does this happen, how to fix it?
plt.show()
municipalities.plot() -> plot = Mercator plot
plt.show()

改crs就可以了,下面我是用子图做的。如果你保持相同的 ax 对象,我认为可能很难看到它们,因为限制完全不同。

import geopandas as gpd
import matplotlib.pyplot as plt
from fiona.crs import from_epsg

municipalities = gpd.read_file("BELGIUM__Municipalities.shp")

fig, ax = plt.subplots(1, 2)
for a in ax:
    a.spines['top'].set_visible(False)
    a.spines['right'].set_visible(False)
    a.spines['left'].set_visible(False)
    a.spines['bottom'].set_visible(False)
    a.get_xaxis().set_visible(False)
    a.get_yaxis().set_visible(False)

municipalities.plot(ax=ax[0], color='red')

municipalities = municipalities.to_crs("epsg:3395")
municipalities.plot(ax=ax[1])

plt.show()

编辑: 在您的第二次调用中,您的斧头不再指代视觉上存在的区域,因此您可以重新创建它:


import geopandas as gpd
import matplotlib.pyplot as plt
from fiona.crs import from_epsg

municipalities = gpd.read_file("BELGIUM__Municipalities.shp")

def init():
    fig,ax = plt.subplots()
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    return ax

ax = init()
municipalities.plot(ax = ax) 
plt.show()

ax = init()
municipalities = municipalities.to_crs("epsg:3395")
municipalities.plot(ax=ax) 
plt.show()
municipalities.plot()
plt.show()

在最后一次调用中,matplotlib 创建了一个新的轴对象,因为您没有提到要使用的任何轴。