Создание 3D полигонообразных заливок для линейных графиков

Beginner

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

Введение

В этом руководстве мы узнаем, как создавать полигоны, заполняющие пространство под линией на графике в трехмерной диаграмме с использованием библиотеки Matplotlib для Python. Полигоны будут полупрозрачными, создавая своего рода эффект "рваного彩绘 стекла".

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

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

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

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

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

Начнем с импорта необходимых библиотек.

import math
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import PolyCollection

Определяем функцию для полигона под графиком

Далее определим функцию polygon_under_graph(x, y), которая строит список вершин, определяющий полигон, заполняющий пространство под линией графика (x, y). Эта функция предполагает, что x упорядочен по возрастанию.

def polygon_under_graph(x, y):
    """
    Construct the vertex list which defines the polygon filling the space under
    the (x, y) line graph. This assumes x is in ascending order.
    """
    return [(x[0], 0.), *zip(x, y), (x[-1], 0.)]

Создаем трехмерную диаграмму

Теперь мы создадим трехмерную диаграмму с использованием Matplotlib.

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

Определяем массивы x и lambda

Мы определяем массивы x и lambda с использованием функций linspace и range соответственно.

x = np.linspace(0., 10., 31)
lambdas = range(1, 9)

Вычисляем вершины и цвета граней

Мы вычисляем вершины и цвета граней с использованием функций vectorize и colormaps из Matplotlib.

## verts[i] is a list of (x, y) pairs defining polygon i.
gamma = np.vectorize(math.gamma)
verts = [polygon_under_graph(x, l**x * np.exp(-l) / gamma(x + 1))
         for l in lambdas]
facecolors = plt.colormaps['viridis_r'](np.linspace(0, 1, len(verts)))

Создаем полигоны и добавляем их на график

Мы создаем полигоны с использованием функции PolyCollection из Matplotlib и добавляем их на график.

poly = PolyCollection(verts, facecolors=facecolors, alpha=.7)
ax.add_collection3d(poly, zs=lambdas, zdir='y')

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

Наконец, мы задаем пределы и метки графика с использованием функции set.

ax.set(xlim=(0, 10), ylim=(1, 9), zlim=(0, 0.35),
       xlabel='x', ylabel=r'$\lambda$', zlabel='probability')

Показываем график

Мы отображаем график с использованием функции show.

plt.show()

Резюме

В этом уроке мы узнали, как создавать полигоны, заполняющие пространство под линией на 3D-графике с использованием библиотеки Matplotlib для Python. Мы использовали функцию PolyCollection для создания полигонов и задавали пределы и метки графика с использованием функции set.