【发布时间】:2014-08-21 03:35:06
【问题描述】:
我知道 matplotlib 和 scipy 可以做双三次插值: http://matplotlib.org/examples/pylab_examples/image_interp.html http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html
我也知道用matplotlib画世界地图是可以的: http://matplotlib.org/basemap/users/geography.html http://matplotlib.org/basemap/users/examples.html http://matplotlib.org/basemap/api/basemap_api.html
但是我可以根据 4 个数据点进行双三次插值并且只对陆地进行着色吗?
例如将这些用于 4 个数据点(经度和纬度)和颜色:
Lagos: 6.453056, 3.395833; red HSV 0 100 100 (or z = 0)
Cairo: 30.05, 31.233333; green HSV 90 100 100 (or z = 90)
Johannesburg: -26.204444, 28.045556; cyan HSV 180 100 100 (or z = 180)
Mogadishu: 2.033333, 45.35; purple HSV 270 100 100 (or z = 270)
我认为必须可以在经纬度范围内进行双三次插值,然后在该图层顶部添加海洋、湖泊和河流?我可以用drawmapboundary 做到这一点。实际上有一个选项maskoceans:
http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.maskoceans
我可以像这样插入数据:
xnew, ynew = np.mgrid[-1:1:70j, -1:1:70j]
tck = interpolate.bisplrep(x, y, z, s=0)
znew = interpolate.bisplev(xnew[:,0], ynew[0,:], tck)
或者scipy.interpolate.interp2d:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html
这里解释了如何转换为地图投影坐标: http://matplotlib.org/basemap/users/mapcoords.html
但我需要弄清楚如何为计算表面而不是单个点执行此操作。实际上有一个使用外部数据的地形图示例,我应该能够复制: http://matplotlib.org/basemap/users/examples.html
附:我不是在寻找一个完整的解决方案。我更愿意自己解决这个问题。相反,我正在寻找建议和提示。我使用 gnuplot 已经 10 多年了,并且在过去几周内才切换到 matplotlib,所以请不要以为我知道关于 matplotlib 的最简单的事情。
【问题讨论】:
-
我自己也想弄清楚同样的事情。运气好吗?
-
这对我来说将是一个圣诞节项目。所以如果你能等到 2015 年……
-
您真的想要一个表面,而不是一组(可能非常密集的)点?您是指 interp2d 输出的函数类型吗?
-
是的,在这个阶段有一组密集的点就可以了。我似乎找不到时间来做这件事。我应该删除这个问题。为此,我将为自己设定一个截止日期为 4 月 1 日。
标签: python numpy matplotlib scipy matplotlib-basemap