我正在尝试在Python上使用Basemap绘制一些天气数据(我也可以尝试使用Cartopy)。目前,我的天气数据看起来像this。我的数据源基本上是一个数组,每个位置对应于网格的一个正方形,每个值指示该正方形应具有的颜色。用于生成此图像的代码如下所示,其中网格的每个正方形等于1000 m:
grid_0 = np.asarray(dec.split())
grid_1=np.reshape(grid_0,(n_cols,n_rows))
grid_2 = grid_1.astype(float)
# Make plot
plt.figure(figsize=(30,30))
fig, ax = plt.subplots()
plt.axis('off')
cax = ax.imshow(grid_2, interpolation='nearest', cmap=cmap)
我掌握了网格下角的地理位置信息。我相信在地图上绘制此内容的最佳方法是以某种方式使用contourf()函数,但是我对Basemap还是很陌生,无法找到将其转换为contourf()可以理解的方法。为了确定地图,我使用底图,其中lon_air和lat_air是某个机场的坐标:
fig=figure(1, figsize=(19, 15))
m = Basemap(projection='cyl', llcrnrlon=lon_air-25, llcrnrlat=lat_air-15,
urcrnrlon=lon_air+25, urcrnrlat=lat_air+15, resolution='h', area_thresh=10000)
m.drawstates(linewidth=0.5, color='black', zorder=4)
m.drawcountries(linewidth=2.0, color='white', zorder=3)
m.drawmapboundary(fill_color='#e5f5ff')
m.fillcontinents(color='#DFDFDF', zorder=1)
m.scatter(lon_air, lat_air,marker='o',color='k', zorder=10)
x0, y0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371))
x1, y1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371))
im = plt.imshow(plt.imread('./pngs/9905.png'), extent=(x0, x1, y0, y1), zorder=2)
plt.show()
如果有人认为需要更多详细信息,我将编辑该帖子。预先感谢大家!
答案 0 :(得分:1)
产生Basemap.contourf
图是一个非常标准的过程。您的plt.imread
命令应返回一个二维numpy
数组(假设它是灰度的),因此请执行以下操作以获取实际数据及其尺寸:
data = plt.imread('./pngs/9905.png')
lx, ly = data.shape
接下来,您需要为数据的每个点提供坐标。对于contourf
,可通过提供两个附加的2D字段来完成此操作,一个带有x坐标,另一个带有y坐标。您可以使用np.linspace
和np.meshgrid
获得正确的表单:
lon0, lat0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371))
lon1, lat1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371))
lons = np.linspace(lon0, lon1, lx) #1D
lats = np.linspace(lat0, lat1, ly) #1D
lon, lat = np.meshgrid(lons,lats) #1D --> 2D
现在,您仍然需要将地图坐标转换为投影坐标,然后绘制整个图形:
x,y = m(lon, lat)
m.contourf(x,y,data)
plt.show()
数据的排列可能仍然存在一些问题(有时会有些混乱),因此您可能必须对它进行转置(data.T
)或反转尺寸(通过索引[::-1]
) 。如果您遇到此类问题,请询问(或提供示例图片),然后我可以相应地调整答案。哦,记住要添加
import numpy as np
脚本开头的某个地方。