Найти в Дзене
programmer's notes (python and more)

Программирование на языке python. Библиотека matplotlib. Построение поверхностей

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Построение поверхностей с помощь библиотеки matplotlib

Сегодня рассматриваем возможности matplotlib для построеня поверхностей. С трёхмерной системой координат мы уже познакомились в прошлой статье. Построение поверхности сводится в конечном итоге к построению графиков функций двух переменных. Суть подхода очень проста. Удобнее всего использовать библиотеку numpy. Определяем диапазоны значений x и y и строим сетку значений на полученном прямоугольнике. Вот примерно так

x = np.linspace (-10, 10, 100)
y = np.linspace (-10, 10, 100)
x, y = np.meshgrid(x, y)

Ну, а далее определяем функцию, которую будем строить. Рассмотрим пример

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace (-10, 10, 100)
y = np.linspace (-10, 10, 100)
x, y = np.meshgrid(x, y)
z = -8 * x * y * x * y + 3 * x * x - 3 * y * y + 2
fig = plt.figure()
axes = fig.add_subplot(projection='3d')
axes.plot_surface(x, y, z)
plt.show()

Результат выполнения программы см. на рисунке 1

Рисунок 1. Результат выполнения программы построения поверхности на основе функции двух переменных -8 * x * y * x * y + 3 * x * x - 3 * y * y + 2
Рисунок 1. Результат выполнения программы построения поверхности на основе функции двух переменных -8 * x * y * x * y + 3 * x * x - 3 * y * y + 2

Важно отметить, что трёхмерный график можно поворачивать с помощью мыши, т.е. смотреть поверхность под разными углами просмотра. Но к этому мы ещё вернмся.

Продолжим изучение построения поверхностей. При построении поверхностей часто используется понятие цветовой карты. Цветовая карта определяется параметром cmap и строится на основе значений координаты z.

Рассмотрим следующую программу

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace (-10, 10, 100)
y = np.linspace (-10, 10, 100)
x, y = np.meshgrid(x, y)
z = (np.sin (x) * np.sin (y)) / (x * y)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(x, y, z, cmap='ocean_r')
ax.set_title('Построение поверхности')
plt.savefig("my_diag.png")

Результат работы программы: картинка, она представлена на рисунке 2.

Рисунок 2. Использование цветовой карты в построении поверхностей
Рисунок 2. Использование цветовой карты в построении поверхностей

В библиотеке matplotlib меется множество цветовых карт, список которых можно получить так

from matplotlib import cm
print(dir(cm))

Список довольно обширный, выбирайте.

Для того, чтобы изображение было более наглядным кроме карты используется сетка, которая набрасывается на поверхность. Шаг сетки регулируется двумя параметрами rcount и ccount. По умолчанию они равны 50. Также определяется толщина линий сетки параметром linewidth и её цвет парамтером edgecolors.

Так для построения

ax.plot_surface(x, y, z, cmap='ocean_r', linewidth=0.5, edgecolors='#770000', rcount=30, ccount=30)

Получим график, представленный на рисунке 3

Рисунок 3. График поверхности с заданными параметрами cmap='ocean_r', linewidth=0.5, edgecolors='#770000', rcount=30, ccount=30
Рисунок 3. График поверхности с заданными параметрами cmap='ocean_r', linewidth=0.5, edgecolors='#770000', rcount=30, ccount=30

Как я уже написал, в окне matplotlib можно поворачивать поверхность с помощью мыши. Но угол просмотра можно задавать с помощью метода view_init().

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace (-10, 10, 100)
y = np.linspace (-10, 10, 100)
x, y = np.meshgrid(x, y)
z = (np.sin (x) * np.sin (y)) / (x * y)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(x, y, z, cmap='ocean_r', linewidth=0.5, edgecolors='#770000',\
rcount=30, ccount=30)
ax.set_title('Построение поверхности')
ax.view_init(elev=60, azim=60)
plt.savefig("my_diag.png")

Результат выполнения программы: картинка на рисунке 4.

Рисунок 4. Поверхность с явным заданием угла просмотра
Рисунок 4. Поверхность с явным заданием угла просмотра

Угол просмотра задаётся двумя параметрами в градусах elev, azim. Первый параметр определяет угол по отношению к оси z, второй угол поворота вокруг вертикальной оси.

У метода add_subplot() есть три дополнительных параметра, которые мы до сих пор не использовали. Они полезны в том случае, если мы хотим получить несколько поверхностей на картинке. Первые два парметра определяют положение в окне (строка и столбец), третий номер графика.

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(1, 2, 1, projection='3d')
x1= np.arange(-1,1,0.1)
y1= np.arange(-1,1,0.1)
x1,y1= np.meshgrid(x1,y1)
z1= np.cos(x1*y1*np.pi/3)
ax.plot_surface(x1, y1, z1, color="yellow")
ax = fig.add_subplot(1, 2, 2, projection='3d')
x1= np.arange(-1,1,0.1)
y1= np.arange(-1,1,0.1)
x1,y1= np.meshgrid(x1,y1)
z1= np.exp(x1*y1)
ax.plot_surface(x1, y1, z1, color="green")
plt.savefig("my_diag.png")

Результат работы программы см. на рисуноке 5. Обращаю внимание, что мы здесь не задаём карту, а просто определяем цвет поверхностей.

Рисунок 5. Картинка с двумя поверхностями в двух системах координат
Рисунок 5. Картинка с двумя поверхностями в двух системах координат

Следующая статья

Ну, пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Что вам не понятно? Всё лежит на поверхности
Что вам не понятно? Всё лежит на поверхности