python - Geopandas 在更改 crs 并使用 fig,ax 绘图时绘制空(没有 fig,ax 一切都很好)?
问题描述
当将 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()
编辑: 在您的第二次通话中,您的 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
创建一个新的轴对象,因为您没有提及任何要使用的轴。
推荐阅读
- node.js - 如何过滤从猫鼬中收集 $lookup 的结果
- java - Android XPath 索引问题
- flutter - tensorflow/lite/core/subgraph.cc BytesRequired 溢出的元素数。节点号 1 (CONV_2D) 准备失败。tflite
- node.js - 上传大文件nodejs multer时的ERR_CONNECTION_RESET
- swift - SwiftUI - 在呈现的工作表上从 MessageUI 呈现 messageComposeViewController 时出错
- android - Android 10 - 奇怪的活动生命周期
- c++ - LINK ERROR 2019:未解析的外部符号
- .net - .NET Compact Framework PowerToys
- javascript - 如何在 php 中使用“变量”,它们也是由 Javascript 中的“str_replace”和“array”创建的?
- node.js - 在 swagger-jsdoc 中重用 jsdoc 的 @typedef