使用 Matplotlib 进行地形山体阴影绘制

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验演示了如何使用 Matplotlib 通过不同的混合模式和垂直夸张来创建地形晕渲图。晕渲的目的是为了在二维地图上创建类似三维的视觉效果。在本实验中,我们将学习如何更改混合模式和垂直夸张以实现不同的视觉效果。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入所需库

我们首先导入所需的库,包括 Matplotlib、NumPy 和 LightSource。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
from matplotlib.colors import LightSource

加载数据

接下来,我们使用 Matplotlib 的get_sample_data函数加载示例海拔数据。然后,我们提取海拔数据和网格的像元大小。

dem = get_sample_data('jacksboro_fault_dem.npz')
z = dem['elevation']
dx, dy = dem['dx'], dem['dy']

指定像元大小

如果你需要地形精确的垂直夸张效果,或者不想猜测vert_exag应该设置成什么值,那么你需要指定网格的像元大小(即dxdy参数)。否则,你指定的任何vert_exag值都将相对于输入数据的网格间距。在这一步中,我们以米为单位计算dxdy的值。

dy = 111200 * dy
dx = 111200 * dx * np.cos(np.radians(dem['ymin']))

指定光源和颜色映射表

我们通过设置光源的方位角和高度来指定 LightSource 对象。我们还设置了绘图中要使用的颜色映射表。

ls = LightSource(azdeg=315, altdeg=45)
cmap = plt.cm.gist_earth

创建绘图

我们创建一个 4x3 的绘图网格,以展示具有不同混合模式和垂直夸张效果的山体阴影图。我们首先在第一行展示山体阴影强度图像,然后在其余行放置具有不同混合模式的山体阴影图。我们使用一个 for 循环来遍历不同的垂直夸张值和混合模式。

fig, axs = plt.subplots(nrows=4, ncols=3, figsize=(8, 9))
plt.setp(axs.flat, xticks=[], yticks=[])

for col, ve in zip(axs.T, [0.1, 1, 10]):
    col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray')
    for ax, mode in zip(col[1:], ['hsv', 'overlay','soft']):
        rgb = ls.shade(z, cmap=cmap, blend_mode=mode,
                       vert_exag=ve, dx=dx, dy=dy)
        ax.imshow(rgb)

为绘图添加标签

我们使用set_titleset_ylabel函数为绘图网格的行和列添加标签。我们还为垂直夸张和混合模式组添加了一个标题。

for ax, ve in zip(axs[0], [0.1, 1, 10]):
    ax.set_title(f'{ve}', size=18)
for ax, mode in zip(axs[:, 0], ['Hillshade', 'hsv', 'overlay','soft']):
    ax.set_ylabel(mode, size=18)

axs[0, 1].annotate('Vertical Exaggeration', (0.5, 1), xytext=(0, 30),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='center', va='bottom', size=20)
axs[2, 0].annotate('Blend Mode', (0, 0.5), xytext=(-30, 0),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='right', va='center', size=20, rotation=90)
fig.subplots_adjust(bottom=0.05, right=0.95)

显示绘图

最后,我们使用show函数显示绘图。

plt.show()

总结

在本实验中,我们学习了如何使用 Matplotlib 创建地形山体阴影图。我们使用了不同的混合模式和垂直夸张来实现不同的视觉效果。我们还学习了如何为地形精确的垂直夸张指定网格的像元大小。