如何解决Cartopy是否会使Matplotlib clabel成为NoneType对象?非常奇怪的错误
我遇到了一个问题,即对ax.clabel的调用按需要绘制轮廓标签,但是clabel对象本身却以某种方式“无”。这成为一个问题,因为在长循环的每次迭代之后,我都会擦拭轮廓和轮廓标签对象,如this answer一样,但是会抛出TypeError
,因为它当然不能在NoneType对象。 (我使用这种方法已经有4年了,直到昨天才出现问题。这是在运行Anaconda的Win64 PC上使用matplotlib 3.2.2和cartopy 0.18.0的情况。
我想我已经将其范围缩小到Cartopy成为问题了...但是,我不知道如何。
这是一个简短的脚本,它说明在处理基本2D绘图时可以很好地处理clabel,但是当尝试将pyplot与cartopy一起使用时,会有些麻烦。
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
from time import time
from datetime import datetime,timedelta
from siphon.catalog import TDSCatalog
import cartopy.crs as ccrs
# Recreate the gridded data from the matplotlib contour example
delta = 0.025
x = np.arange(-3.0,3.0,delta)
y = np.arange(-2.0,2.0,delta)
X,Y = np.meshgrid(x,y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2
# Contour it and label it to show that labels work and can be removed as desired
fig,ax = plt.subplots()
cN = ax.contour(X,Y,Z)
lbl = ax.clabel(cN)
#plt.show()
print("\n\nContour label for a basic 2D plot is: ")
print(lbl)
# Now remove those labels
# Will work as intended for lbl
for label in lbl:
label.remove()
# Now try a dataset that needs to be geographically referenced
# Use siphon to get a weather model dataset
# This dataset link will expire on approximately March 9,2021
model_url = "https://www.ncei.noaa.gov/thredds/catalog/model-rap130/202009/20200909/catalog.xml?dataset=rap130/202009/20200909/rap_130_20200909_1800_000.grb2"
vtime = datetime.strptime('2020090918','%Y%m%d%H')
# Get the data
model = TDSCatalog(model_url)
ds = model.datasets[0]
ncss = ds.subset()
query = ncss.query()
query.accept('netcdf')
query.time(vtime) # Set to the analysis hour only
query.add_lonlat()
query.variables('Geopotential_height_isobaric')
data = ncss.get_data(query)
# Get the lats and lons and a data field from the file
lats = data.variables['lat'][:,:]
lons = data.variables['lon'][:,:]
hght = data.variables['Geopotential_height_isobaric'][0,24,:,:] # 700 hPa is 24th element
# Contour that weather data grid
# This requires cartopy,which seems to be the problem
# Redefine the figure,because this time we need to georeference it
fig = plt.figure(5,figsize=(1600/96,1600/96))
ax = fig.add_subplot(111,projection=ccrs.PlateCarree())
cN2 = ax.contour(lons,lats,hght)
lbl2 = ax.clabel(cN2)
#plt.show()
print("\n\nContour label for weather data plot is: ")
print(lbl2)
# Removing labels will not work for lbl2 because it can't iterate over a NoneType object
for label in lbl2:
label.remove()
解决方法
我回滚到Cartopy 0.17.0,错误消失了。因此,我可以确认这是cartopy 0.18.0的错误。我已经在GitHub上打开了一个问题。
,您似乎遇到了this issue;这个问题已经在git中修复,将在下一个版本中发布。同时,您可以执行以下操作:
cN = ax.contour(X,Y,Z)
for text in cN.labelTexts:
text.remove()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。