Введение
В этом практическом занятии показано, как использовать Matplotlib для создания топографических карт с теневым освещением с использованием различных режимов смешивания и вертикального увеличения. Цель создания карт с теневым освещением - создать трехмерное впечатление на двухмерных картах для визуализации. В этом практическом занятии мы научимся настраивать режимы смешивания и вертикальное увеличение, чтобы добиться различных визуальных эффектов.
Советы по использованию ВМ
После запуска виртуальной машины щелкните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в 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
Загружаем данные
Далее мы загружаем примерные данные о высоте с использованием функции get_sample_data из Matplotlib. Затем извлекаем данные о высоте и размер ячейки сетки.
dem = get_sample_data('jacksboro_fault_dem.npz')
z = dem['elevation']
dx, dy = dem['dx'], dem['dy']
Указываем размер ячейки
Если вам нужна топографически точная вертикальная эксцентриситет, или вы не хотите гадать, какое значение vert_exag должно быть, вам нужно указать размер ячейки сетки (то есть параметры dx и dy). В противном случае любое значение vert_exag, которое вы укажете, будет относительным к интервалу сетки ваших входных данных. В этом шаге мы вычисляем значения dx и dy в метрах.
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_title и set_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. Мы использовали различные режимы смешивания и вертикальную эксцентриситет, чтобы добиться различных визуальных эффектов. Мы также узнали, как указать размер ячейки сетки для вертикальной эксцентриситета с учетом топографии.