Matplotlib maskoceans结果使用列表

时间:2017-12-05 09:03:55

标签: python matplotlib scipy interpolation

我有3个列表x,y,z包含long,lat,value。我正在尝试使用contourf和maskoceans构建一个图。我在海岸线附近得到的结果并不是很好。尝试增加linspace的参数会导致内存错误。有没有办法在靠近海岸线的地方取得更好的成绩? 我的代码如下:

import numpy as np
import scipy.interpolate
from mpl_toolkits.basemap import Basemap,maskoceans
import matplotlib.pyplot as plt

x=[23.027008, 22.774524, 23.010211, 22.346053, 21.264416, 21.261967, 21.31769, 21.478437, 21.406678, 21.453064]
y=[36.547227, 36.824754, 37.482874, 37.61182, 37.873769, 37.935473, 37.978032, 38.139038, 38.162707, 38.168772]
z=[155.15, 354.86, 400.2, 47.16, 188.44, 277.01, 375.12, 87.71, 133.85, 123.56]

map =Basemap(projection='mill',
             llcrnrlat=36.928942,llcrnrlon=21.696255,
             urcrnrlat=38.03002,urcrnrlon=23.497298,
             resolution='i')
map.drawcoastlines()

xi, yi = np.linspace(21,24, 100), np.linspace(36, 39, 100)
xi, yi = np.meshgrid(xi, yi)

xm,ym=map(xi,yi)

rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
zi = rbf(xi, yi)

zm=maskoceans(xi,yi,zi,resolution='h',grid=1.25)
map.contourf(xm, ym, zm,cmap='jet')
map.colorbar()


plt.show()

1 个答案:

答案 0 :(得分:1)

你遇到的问题是你的插值网格对于海岸线的复杂性来说还不够好,因为你已经放大了。另外你使用不同的海洋分辨率和你的底图会产生一些奇怪的瑕疵。所以我对你的代码进行了3次更改:

  • 不要使用pi作为变量名 - 它是一个内置的Python函数,不应该被覆盖。

    map

  • 提高插值网格的分辨率

    m = Basemap(...

  • 将蒙面扫描的分辨率与底图匹配

    xi, yi = np.linspace(21,24, 1000), np.linspace(36, 39, 1000)