【发布时间】:2015-04-21 05:35:18
【问题描述】:
当我尝试将“几乎”规则网格化的数据插入地图坐标以便地图和数据都可以用matplotlib.pyplot.imshow 绘制时,scipy.interpolate.griddata 的性能极其缓慢,因为matplotlib.pyplot.pcolormesh 花费的时间太长而且不会与alpha 相处融洽。
最好展示一个例子(输入文件可以下载here):
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
map_extent = (34.4, 36.2, 30.6, 33.4)
# data corners:
lon = np.array([[34.5, 34.83806236],
[35.74547079, 36.1173923]])
lat = np.array([[30.8, 33.29936152],
[30.67890411, 33.17826563]])
# load saved files
topo = np.load('topo.npy')
lons = np.load('lons.npy')
lats = np.load('lats.npy')
data = np.load('data.npy')
# get max res of data
dlon = abs(np.array(np.gradient(lons))).max()
dlat = abs(np.array(np.gradient(lats))).max()
# interpolate the data to the extent of the map
loni,lati = np.meshgrid(np.arange(map_extent[0], map_extent[1]+dlon, dlon),
np.arange(map_extent[2], map_extent[3]+dlat, dlat))
zi = griddata((lons.flatten(),lats.flatten()),
data.flatten(), (loni,lati), method='linear')
绘图:
fig, (ax1,ax2) = plt.subplots(1,2)
ax1.axis(map_extent)
ax1.imshow(topo,extent=extent,cmap='Greys')
ax2.axis(map_extent)
ax2.imshow(topo,extent=extent,cmap='Greys')
ax1.imshow(zi, vmax=0.1, extent=extent, alpha=0.5, origin='lower')
ax1.plot(lon[0],lat[0], '--k', lw=3, zorder=10)
ax1.plot(lon[-1],lat[-1], '--k', lw=3, zorder=10)
ax1.plot(lon.T[0],lat.T[0], '--k', lw=3, zorder=10)
ax1.plot(lon.T[-1],lat.T[-1], '--k', lw=3, zorder=10)
ax2.pcolormesh(lons,lats,data, alpha=0.5)
ax2.plot(lon[0],lat[0], '--k', lw=3, zorder=10)
ax2.plot(lon[-1],lat[-1], '--k', lw=3, zorder=10)
ax2.plot(lon.T[0],lat.T[0], '--k', lw=3, zorder=10)
ax2.plot(lon.T[-1],lat.T[-1], '--k', lw=3, zorder=10)
结果:
注意,这不能通过简单地用仿射变换旋转数据来完成。
griddata 每次调用我的真实数据需要 80 多秒,pcolormesh 需要更长的时间(超过 2 分钟!)。我已经查看了 Jaimi 的回答 here 和 Joe Kington 的回答 here,但我无法找到一种让它为我工作的方法。
我所有的数据集都具有完全相同的lons、lats,所以基本上我需要将它们映射一次到地图的坐标,并对数据本身应用相同的转换。问题是我该怎么做?
【问题讨论】:
标签: python numpy matplotlib scipy