你能描绘罗宾逊预测的流线型吗?

时间:2016-09-24 06:17:53

标签: python matplotlib-basemap

我试图用Robinson投影在全球地图上绘制流线图,但底图似乎不喜欢投影的坐标。当然,它适用于普通的圆柱形投影,它在x方向上是规则的。

以下是一个例子:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

u = np.ones((21,21)) 
v = np.ones((21,21))
lats = np.arange(-90,91,9)
lons = np.arange(-180,181,18)
x,y = np.meshgrid(lons,lats)

# It works for Cylindrical
mp = Basemap(projection='cyl')
xx,yy = mp(x,y)
mp.streamplot(xx,yy,u,v)
mp.drawcoastlines()
plt.show()

# But not Robinson
mp = Basemap(projection='robin',lon_0=0)
xx, yy = mp(x, y) 
mp.streamplot(xx,yy,u,v)
mp.drawcoastlines()
plt.show()

它抱怨x坐标,提出:

ValueError: The rows of 'x' must be equal

那么有可能在罗宾逊预测中绘制流线型吗?

1 个答案:

答案 0 :(得分:0)

使用命令xx,yy = mp(x,y),根据特定投影的坐标转换将应用于您的lon和lats。对于大多数投影,这将导致网格点的扭曲,使得x行不再相等,因此错误:ValueError: The rows of 'x' must be equal。要解决此问题,您需要重新格式化数据,例如:像这样:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib as plt

u = np.ones((21,21)) 
v = np.ones((21,21))
lats = np.arange(-90,91,9)
lons = np.arange(-180,181,18)
x,y = np.meshgrid(lons,lats)

mp = Basemap(projection='robin',lon_0=0)
xx, yy = mp(x, y) 

# generate a grid that is equally spaced in a plot with the current pojection
lons, lats, xxnew, yynew = mp.makegrid(21,21, returnxy=True)

# project the data onto the new grid
unew = plt.mlab.griddata(xx.flatten(), yy.flatten(),u.flatten(), xxnew, yynew ,interp='linear')
vnew = plt.mlab.griddata(xx.flatten(), yy.flatten(),v.flatten(), xxnew, yynew ,interp='linear')

mp.streamplot(xxnew,yynew,unew,vnew)
mp.drawcoastlines()
plt.show()