我正在使用gfs天气数据来使用python和matplotlib绘制某些参数。由于它是一个grib2文件,我使用wgrib2从文件中提取数据(即使我知道pygrib)。这些提取的变量(lat,lon和temp)成功地被纳入了numpy arrary。我附上了这些lat,lon和data值供您查看。我用于绘图的代码部分是: -
lat = # load from attached lat file
lon = # load from attached lon file
data = # load data from data file
plt.figure()
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(),
resolution='c')
x, y = m(lat, lon)
cs = m.contourf(x, y, data)
m.drawcoastlines()
m.fillcontinents()
m.drawmapboundary()
plt.show()
现在,当我使用matplotlib countorf
函数进行绘图时,会产生以下错误: -
File "wgrib2.py", line 145, in <module>
cs = m.contourf(x, y, data)
File "/usr/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform
return plotfunc(self,x,y,data,*args,**kwargs)
File "/usr/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 3644, in contourf
xx = x[x.shape[0]/2,:]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
有人可以帮我解决这个问题吗?
以下是请求的最小示例(实际文件在上面的链接中上传): -
#!/usr/bin/python2
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, division
import os
import subprocess
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
lat = np.loadtxt("lat.txt")
lon = np.loadtxt("lon.txt")
data = np.loadtxt("data.txt")
plt.figure()
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(),
resolution='c')
x, y = m(lat, lon)
cs = m.contourf(x, y, data)
m.drawcoastlines()
m.fillcontinents()
m.drawmapboundary()
plt.show()
修改1
再次上传文件。
这似乎是数据维度的问题。由wgrib2生成到numpy数组的输出是单个维度,其值为(259920,),用于lat,lon和data。我已经检查了pygrib,它产生的形状为(720,361),导致720 x 361 = 259920.因此,似乎我有一个数据被转换为numpy的问题。
答案 0 :(得分:1)
您的代码在使用底图1.1.0的Python 3.5上不会产生错误,因此如果您升级底图,则应该修复此错误。如果您实际上正在运行Python 2(由最小示例建议),那么从division
导入中删除__future__
可能就足够了。
特别是,此MCVE不会产生错误:
from __future__ import print_function, unicode_literals, division
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
lat = np.linspace(-90, 90, 180)
lon = np.linspace(-180, 180, 360)
lat, lon = np.meshgrid(lat, lon)
data = np.random.randn(360, 180)
plt.figure()
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(),
resolution='c')
x, y = m(lon, lat)
cs = m.contourf(x, y, data)
m.drawcoastlines()
m.fillcontinents()
m.drawmapboundary()
plt.show()
如果出于某种原因无法正常工作并且您想在此处修补错误问题,可以进入basemap
源代码并将xx = x[x.shape[0]/2,:]
更改为xx = {{1 }}。我从Ben那里听到的建议是,如果你这样做,你可能会继续遇到其他兼容性问题(可能就在你做出修复之后),但可能会获取此代码现在工作。
请记住,x[int(x.shape[0]/2),:]
不支持Python 3,不推荐使用。 Basemap的核心开发人员(Ben Root)敦促用户停止使用它,因为它已被放弃并且不会被移植到Python 3,即使Python 2在2020年停止接收安全更新。他建议使用{{ 1}}而不是。所有这些都是Ben Root在2017年Scipy所说的。