# 准备画轮廓图的数据点 X, Y = np.meshgrid(xgrid[::5], ygrid[::5][::-1]) land_reference = data.coverages[6][::5, ::5] land_mask = (land_reference > -9999).ravel() xy = np.vstack([Y.ravel(), X.ravel()]).T xy = np.radians(xy[land_mask]) # 创建两幅并排的图 fig, ax = plt.subplots(1, 2) fig.subplots_adjust(left=0.05, right=0.95, wspace=0.05) species_names = ['Bradypus Variegatus', 'Microryzomys Minutus'] cmaps = ['Purples', 'Reds'] for i, axi in enumerate(ax): axi.set_title(species_names[i]) # 用Basemap画出海岸线 m = Basemap(projection='cyl', llcrnrlat=Y.min(), urcrnrlat=Y.max(), llcrnrlon=X.min(), urcrnrlon=X.max(), resolution='c', ax=axi) m.drawmapboundary(fill_color='#DDEEFF') m.drawcoastlines() m.drawcountries() # 构建一个球形的分布核密度估计 kde = KernelDensity(bandwidth=0.03, metric='haversine') kde.fit(np.radians(latlon[species == i])) # 只计算大陆的值:-9999表示是海洋 Z = np.full(land_mask.shape[0], -9999.0) Z[land_mask] = np.exp(kde.score_samples(xy)) Z = Z.reshape(X.shape) # 画出密度的轮廓 levels = np.linspace(0, Z.max(), 25) axi.contourf(X, Y, Z, levels=levels, cmap=cmaps[i])
时间: 2024-01-25 07:04:18 浏览: 81
这段代码使用了 Matplotlib 库和 Basemap 库绘制了两幅并排的轮廓图。首先,使用 `np.meshgrid()` 函数生成了两个二维数组 `X` 和 `Y`,用于在 x 轴和 y 轴上绘制轮廓图的网格。然后,使用 `data.coverages[6][::5, ::5]` 获取了数据的第 6 个覆盖范围,并使用 `land_mask = (land_reference > -9999).ravel()` 创建了一个一维布尔数组,用于筛选出陆地上的数据点。接着,使用 `np.vstack()` 函数和 `np.radians()` 函数将筛选出的数据点转换为弧度制,并将其存储在 `xy` 变量中。接下来,使用 `Basemap()` 函数创建了一个地图投影,并使用 `m.drawmapboundary()`、`m.drawcoastlines()` 和 `m.drawcountries()` 函数绘制了地图边界、海岸线和国家边界。然后,使用 `KernelDensity()` 函数创建了一个球形分布的核密度估计,使用 `kde.fit()` 函数拟合了第一个物种的数据,并将其存储在 `Z` 变量中。接着,使用 `np.full()` 函数创建一个全为 -9999 的一维数组 `Z`,并将筛选出的陆地上的数据点的密度估计结果存储在 `Z` 中。然后,使用 `Z.reshape()` 函数将一维数组 `Z` 转换为二维数组,以匹配 `X` 和 `Y` 的形状。最后,使用 `axi.contourf()` 函数绘制了密度的轮廓,并使用 `cmaps[i]` 参数指定了颜色映射。
阅读全文