Доброго времени суток, читатели, зрители моего канала 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
Важно отметить, что трёхмерный график можно поворачивать с помощью мыши, т.е. смотреть поверхность под разными углами просмотра. Но к этому мы ещё вернмся.
Продолжим изучение построения поверхностей. При построении поверхностей часто используется понятие цветовой карты. Цветовая карта определяется параметром 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.
В библиотеке 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
Как я уже написал, в окне 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.
Угол просмотра задаётся двумя параметрами в градусах 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. Обращаю внимание, что мы здесь не задаём карту, а просто определяем цвет поверхностей.
Следующая статья
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.