Рисование плоских объектов на трехмерном графике

Beginner

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

Введение

Matplotlib - популярная библиотека визуализации данных на Python. Она предоставляет широкий спектр функций для создания различных типов графиков и диаграмм. Одной из особенностей Matplotlib является возможность рисования плоских объектов в трехмерных графиках. В этом практическом занятии мы проведем вас по процессу рисования плоских объектов в трехмерных графиках с использованием Matplotlib.

Советы по работе с ВМ

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

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки

Начнем с импорта необходимых библиотек, таких как Matplotlib, NumPy и mpl_toolkits.mplot3d.art3d.

import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d.art3d as art3d

Создаем трехмерный график

Мы создадим трехмерный график с использованием функции add_subplot Matplotlib. Параметр projection устанавливается в '3d', чтобы создать трехмерный график.

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

Нарисуем круг на стене

Мы нарисуем круг на стене x=0 трехмерного графика с использованием функций Circle и pathpatch_2d_to_3d Matplotlib.

p = Circle((5, 5), 3)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z=0, zdir="x")

Пометим оси

Мы вручную оформим метки на осях с использованием функции text3d. Функция принимает позицию текста, текст для отображения, ось, которая будет восприниматься как третья размерность, и другие параметры.

def text3d(ax, xyz, s, zdir="z", size=None, angle=0, usetex=False, **kwargs):
    """
    Plots the string *s* on the axes *ax*, with position *xyz*, size *size*,
    and rotation angle *angle*. *zdir* gives the axis which is to be treated as
    the third dimension. *usetex* is a boolean indicating whether the string
    should be run through a LaTeX subprocess or not.  Any additional keyword
    arguments are forwarded to `.transform_path`.

    Note: zdir affects the interpretation of xyz.
    """
    x, y, z = xyz
    if zdir == "y":
        xy1, z1 = (x, z), y
    elif zdir == "x":
        xy1, z1 = (y, z), x
    else:
        xy1, z1 = (x, y), z

    text_path = TextPath((0, 0), s, size=size, usetex=usetex)
    trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1])

    p1 = PathPatch(trans.transform_path(text_path), **kwargs)
    ax.add_patch(p1)
    art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir)


text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False,
       ec="none", fc="k")
text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False,
       angle=np.pi / 2, ec="none", fc="k")
text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False,
       angle=np.pi / 2, ec="none", fc="k")

Напишем формулу LaTeX на полу

Мы напишем формулу LaTeX на полу z = 0 трехмерного графика с использованием функции text3d.

text3d(ax, (1, 5, 0),
       r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = "
       r"\frac{8\pi G}{c^4} T_{\mu\nu}  $",
       zdir="z", size=1, usetex=True,
       ec="none", fc="k")

Зададим пределы и покажем график

Мы зададим пределы по осям x, y и z с использованием функций set_xlim, set_ylim и set_zlim Matplotlib. Наконец, мы покажем трехмерный график с использованием функции show Matplotlib.

ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)

plt.show()

Резюме

В этом практическом занятии мы узнали, как рисовать плоские объекты на трехмерных графиках с использованием Matplotlib. Мы создали трехмерный график, нарисовали круг на стене, подписали оси, написали формулу LaTeX на полу и установили пределы осей.