Geo pandas участок пустой при смене crs и графике с помощью fig, ax (без fig, ax все нормально)? - PullRequest
1 голос
/ 14 апреля 2020

При использовании fig, ax из matplotlib в сочетании с кадром данных geo pandas И при изменении .crs график пуст. Кто-нибудь знает, почему это происходит и как это исправить?

Набор данных: https://hub.arcgis.com/datasets/esribeluxdata :: belgium-муниципалитеты-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()

1 Ответ

1 голос
/ 14 апреля 2020

Это нормально, чтобы изменить 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()

РЕДАКТИРОВАТЬ: Во время второго вызова ваш ax больше не ссылается на визуально существующую область, поэтому вы можете сделать это, чтобы воссоздать ее:


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 создает новый объект axes, поскольку вы не упоминаете никаких осей для работа с.

...