Как рисовать графику трехкомпонентной системы
Поделиться в соцсетях:
Удалить функцию
параметр u [ ; ]
параметр v [ ; ]
Удалить функцию
Операция | Описание |
---|---|
* | умножение |
/ | деление |
+ | сложение |
— | вычитание |
x^n | возведение x в степень n |
x^(1/n) | извлечение корня n -ой степени из x |
Константа | Описание |
---|---|
pi | число ПИ = 3.141592. |
e | число Эйлера = 2.718281. |
ln2 | натуральный логарифм от 2 |
ln10 | натуральный логарифм от 10 |
sqrt2 | квадратный корень из 2 |
sqrt3 | квадратный корень из 3 |
Функция | Описание |
---|---|
sqrt(x) | квадратный корень из x |
abs(x) | абсолютное значение (модуль) x |
ln(x) , log(x) | натуральный логарифм x |
log2(x) | логарифм по основанию 2 от x |
log3(x) | логарифм по основанию 3 от x |
lg(x) , log10(x) | логарифм по основанию 10 от x |
exp(x) | возводит число Эйлера в степень x |
sin(x) | синус аргумента x , параметр x задается в радианах |
cos(x) | косинус аргумента x , параметр x задается в радианах |
tan(x) | тангенс аргумента x , параметр x задается в радианах |
cotan(x) | котангенс аргумента x , параметр x задается в радианах |
asin(x) , arcsin(x) | возвращает арксинус аргумента x в радианах |
acos(x) , arccos(x) | возвращает арккосинус аргумента x в радианах |
atan(x) , arctan(x) | возвращает арктангенс аргумента x в радианах |
acotan(x) , arccotan(x) | возвращает арккотангенс аргумента x в радианах |
sinh(x) | гиперболический синус аргумента x |
cosh(x) | гиперболический косинус аргумента x |
tanh(x) | гиперболический тангенс аргумента x |
asinh(x) , arcsinh(x) | гиперболический арксинус аргумента x |
acosh(x) , arccosh(x) | гиперболический арккосинус аргумента x |
atanh(x) , arctanh(x) | гиперболический арктангенс аргумента x |
sec(x) | секанс аргумента x |
cosec(x) | косеканс аргумента x |
round(x) | возвращает округленное значение x |
ceil(x) | округляет x в большую сторону |
floor(x) | округляет x в меньшую сторону |
sgn(x) | «сигнум» — знак аргумента x возвращает -1 при x < 0 , 0 при x = 0 , 1 при x >0 |
© OddLabs, 2011-2024 | Правильность результатов не гарантируется
Как строить трехмерные графики
Следующим шагом мы с вами рассмотрим возможности построения трехмерных графиков в пакете matplotlib. Такая возможность появилась, начиная с версии 0.99, поэтому убедитесь, что ваш пакет поддерживает трехмерные графики.
Все дополнительные классы для работы в 3D находятся в модуле:
и вначале мы его импортируем в нашу программу наряду с самим пакетом matplotlib и numpy:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
А, затем, создадим трехмерную систему координат:
fig = plt.figure(figsize=(7, 4)) ax_3d = Axes3D(fig) plt.show()
При выполнении этой простой программы, мы в окне увидим три пространственные оси, которые можно вращать с помощью курсора мышки:
Того же самого результат можно добиться, используя параметр projection при создании системы координат:
fig = plt.figure(figsize=(7, 4)) ax_3d = fig.add_subplot(projection='3d')
Как именно создавать трехмерные оси, зависит от вашего выбора и удобства при написании конкретных программ. Я остановлюсь на втором способе.
- plot() – линейный 2D график в трех измерениях;
- step() – ступенчатый 2D график в трех измерениях;
- scatter() – точеный график 3D график.
- plot_wireframe() – построение каркасной поверхности в 3D;
- plot_surface() – построение непрерывной 3D поверхности.
x = np.linspace(0, 10, 50) z = np.cos(x) ax_3d.plot(x, x, z)
То есть, мы здесь по координатам x, y выбираем одни и те же значения, а координата z (вертикаль) – это значение функции. Давайте подпишем оси, чтобы видеть, где какая расположена на этом графике:
ax_3d.set_xlabel('x') ax_3d.set_ylabel('y') ax_3d.set_zlabel('z')
Но то, что мы получили, это не совсем трехмерный график. Скорее, это двумерная косинусоида в трех измерениях. Давайте построим настоящее трехмерное изображение, например, вот такой функции: Первое, что нам здесь нужно сделать – это сформировать двумерную сетку координат по осям x и y:
То есть, должны быть сформированы двумерные массивы x, y, которые для текущей точки с индексами (i, j) возвращают ее координаты в плоскости xy. Для регулярных сеток эти массивы можно сформировать следующим образом. Определим множество координат x (для столбцов) и y (для строк), например, так:
x = [1, 2, 3] y = [2, 5, 6, 8]
А, затем, используя функцию meshgrid() сформируем регулярную сетку на основе этих данных:
xgrid, ygrid = np.meshgrid(x, y)
На выходе получим двумерные массивы со значениями: То есть, смотрите, теперь для любой пары индексов (i, j) мы легко сможем получить координаты точки в плоскости xy:
(xgrid[1, 2], ygrid[1, 2]) = (3, 5) (xgrid[3, 0], ygrid[3, 0]) = (1, 8)
Но зачем было так все усложнять? Почему бы не использовать одномерные массивы x, y вместо двумерных xgrid, ygrid? Дело в том, что одномерные массивы, которые описывают расположение строк и столбов, могут формировать только регулярные сетки, то есть, прямоугольные. А что, если нужно сформировать гексагональную сетку, которая выглядит, следующим образом: Здесь уже не получится обойтись указанными одномерными массивами, а нужно прописывать узлы двумерными массивами. Именно поэтому, в общем случае, и реализовано отображение через двумерные массивы трехмерных графиков. Итак, давайте теперь построим полноценный трехмерный график синусоиды на регулярной сетке. Для этого мы сначала сформируем координаты узлов в плоскости xy:
x = np.arange(-2*np.pi, 2*np.pi, 0.2) y = np.arange(-2*np.pi, 2*np.pi, 0.2) xgrid, ygrid = np.meshgrid(x, y)
А, затем, вычислим значения синусоиды в этих узлах:
zgrid = np.sin(xgrid) * np.sin(ygrid) / (xgrid * ygrid)
Если для вывода такого графика воспользоваться функцией plot_wireframe():
ax_3d.plot_wireframe(xgrid, ygrid, zgrid)
то результат будет следующий: Как видите, мы получили полноценный каркасный трехмерный график синусоиды. Или же можно построить полноценную поверхность в виде синусоиды, используя функцию plot_surface():
ax_3d.plot_surface(xgrid, ygrid, zgrid)
Фактически, только этим две эти функции и отличаются друг от друга: первая строит 3D-каркас, а вторая 3D-поверхность. У этих функций есть следующие параметры для настройки внешнего вида графика:
Параметр | Описание |
x, y, z | 2D массивы для построения трехмерных графиков. |
rcount, ccount | Максимальное число элементов каркаса по координатам x и y (по умолчанию 50). |
rstride, cstride | Величина шага, с которым будут выбираться элементы из массивов x, y (параметры rstride, cstride и rcount, ccount – взаимоисключающие). |
color | Цвет графика |
cmap | Цветовая карта графика |
Например, если установить параметры:
ax_3d.plot_surface(xgrid, ygrid, zgrid, rstride=5, cstride=5, cmap='plasma')
то получим следующий вид нашей синусоиды: В заключение этого занятия приведу пример построения этого же графика набором точек, используя функцию scatter():
ax_3d.scatter(xgrid, ygrid, zgrid, s=1, color='g')
Увидим следующий результат: Вот так в базовом варианте можно выполнять построения трехмерных графиков в пакете matplotlib. Этой информации достаточно для большинства прикладных задач. Ну а если потребуется реализовать что-то особенное, тогда прямой путь к документации: https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html
Как рисовать графику трехкомпонентной системы
Графика трехкомпонентной системы — это важный аспект визуализации данных, который позволяет представить информацию с помощью трех основных компонент: цвета, формы и расположения. Создание эффективной трехкомпонентной графики требует умения правильно сочетать эти компоненты и использовать их для передачи нужной информации.
В данной статье мы предлагаем лучшие техники и советы по созданию графики трехкомпонентной системы. Во-первых, выбор цветовой палитры играет ключевую роль в создании эффективной графики. Важно использовать цвета, которые ярко выделяются и хорошо читаются на фоне. Кроме того, цвета нужно использовать для передачи семантической информации, например, различных категорий данных или их значимости.
Другой важный аспект создания трехкомпонентной графики — это использование различных форм для представления данных. Формы могут быть использованы для выделения объектов или группировки данных, а также для создания визуальных связей между элементами. Обратите внимание, что формы должны быть консистентными и понятными для пользователя.
Наконец, расположение объектов на графике также играет важную роль в передаче информации. Размещение элементов с учетом их значимости и семантики помогает пользователям быстро понять данные. Кроме того, выравнивание и пространственные отношения между объектами также должны быть учетными и логичными.
Основы трехкомпонентной системы
Трехкомпонентная система — это подход к созданию графического интерфейса, который разделяет компоненты на три основных типа: данные (data), представление (components) и логику (logic). Этот подход позволяет создавать модульный и переиспользуемый код, что улучшает эффективность разработки и обслуживания.
Компоненты данных отвечают за управление и обработку данных. Они могут быть связаны с базой данных, API или другими источниками данных. Основная задача компонентов данных — собирать и обрабатывать данные для дальнейшего использования компонентами представления и логики.
Компоненты представления отвечают за отображение данных пользователю. Они могут быть визуальными элементами интерфейса, такими как кнопки, формы, таблицы, и др. Компоненты представления используют данные, полученные от компонентов данных, и отображают их пользователю в удобной форме.
Компоненты логики отвечают за логику взаимодействия между компонентами данных и представления. Они могут выполнять сложные вычисления, обрабатывать события пользователя и управлять состоянием компонентов представления. Компоненты логики позволяют реагировать на действия пользователя и обновлять состояние компонентов данных и представления.
Трехкомпонентная система помогает организовать код и улучшить его читаемость и поддерживаемость. Каждый тип компонента выполняет свою роль в процессе разработки графического интерфейса, что упрощает внесение изменений и добавление новых функций.
Разделение компонентов на данные, представление и логику позволяет разработчикам работать над отдельными частями системы независимо друг от друга. Это делает код более модульным и переиспользуемым, что уменьшает время разработки и обслуживания.
Преимущества и возможности трехкомпонентной системы
Трехкомпонентная система, или 3CS, стала одним из самых популярных подходов к созданию графики. Она позволяет разделить логику, представление и состояние компонентов, что приводит к более гибкой и модульной архитектуре проекта. В этом разделе мы рассмотрим преимущества и возможности, которые предлагает трехкомпонентная система.
- Улучшенная переиспользуемость компонентов. Благодаря разделению логики и представления, компоненты становятся более независимыми и могут переиспользоваться в разных частях проекта. Это позволяет значительно упростить разработку и сэкономить время.
- Простота поддержки проекта. В трехкомпонентной системе каждый компонент отвечает только за свою функцию. Это делает код более понятным, легко читаемым и облегчает обнаружение и исправление ошибок.
- Масштабируемость и гибкость. Благодаря модульной структуре и возможностям трехкомпонентной системы, проект можно легко масштабировать и изменять. Добавление новых компонентов, изменение существующих или их удаление — это простые операции, которые не требуют особых усилий.
- Большой выбор инструментов и библиотек. В настоящее время существует множество инструментов и библиотек, которые поддерживают трехкомпонентную систему. Они предоставляют широкий набор возможностей и упрощают процесс разработки.
- Легкая интеграция с другими системами. Трехкомпонентная система обеспечивает хорошую модульность, что упрощает интеграцию с другими системами и инструментами. Вы можете легко добавлять и использовать сторонние модули или библиотеки, чтобы расширить функционал ваших компонентов.
Независимо от того, какой проект вы разрабатываете, трехкомпонентная система может стать сильным инструментом для создания графики. Она позволяет создавать гибкие, переиспользуемые и легко поддерживаемые компоненты, что значительно упрощает процесс разработки и позволяет сосредоточиться на том, что действительно важно — на создании качественной графики.
Техники создания графики трехкомпонентной системы
В создании графики для трехкомпонентной системы существует несколько техник, которые могут помочь вам достичь желаемого результата. Ниже приведены некоторые из них.
- Использование цветовой схемы. Выбор правильной цветовой схемы для вашей графики может значительно улучшить ее восприятие. Рекомендуется использовать цвета, которые хорошо отличаются друг от друга и создают контраст.
- Использование оттенков. Вместо использования только основных цветов, можно добавить оттенки и тонирование для создания более интересной и глубокой графики. Это может быть особенно полезно при создании трехкомпонентной системы, где различные оттенки могут помочь визуально отделить каждую компоненту.
- Использование иконок или символов. Добавление иконок или символов к вашей графике может помочь сделать ее более наглядной и понятной. Выбирайте иконки, которые ясно передают смысл каждой компоненты и помогают пользователям быстро понять структуру системы.
- Использование раскладки в виде таблицы. Если у вас есть большое количество компонентов, вы можете использовать таблицу для организации их визуализации. Это поможет сделать вашу графику более структурированной и удобной для чтения.
- Использование наглядных дополнений. Вы можете добавить стрелки, линии или другие наглядные элементы, чтобы помочь пользователям понять связи и взаимодействия между компонентами вашей трехкомпонентной системы.
Используя эти техники, вы сможете создать качественную и понятную графику для трехкомпонентной системы, которая поможет пользователям лучше воспринять информацию и ориентироваться в вашем продукте.
Выбор цветовой схемы
Выбор цветовой схемы является важным аспектом создания графики для трехкомпонентной системы. Цвета могут иметь огромное влияние на восприятие и эмоциональную реакцию пользователей, поэтому важно выбирать и комбинировать цвета с умом.
Вот несколько советов, которые помогут вам с выбором цветовой схемы:
- Учитывайте цветовой контекст: При выборе цветовой схемы для трехкомпонентной системы важно учитывать контекст, в котором графика будет использоваться. Например, если система будет использоваться в медицинских целях, то стоит выбрать спокойные и нейтральные цвета, такие как синий или зеленый.
- Используйте сочетание контрастных цветов: Контрастные цвета помогут выделить важные элементы системы и создать привлекательную и читаемую графику. Например, комбинация ярко-красного и черного цветов может привлечь внимание к важным деталям.
- Избегайте слишком ярких и насыщенных цветов: Слишком яркие и насыщенные цвета могут вызвать раздражение или утомление у пользователей. Лучше выбирать более приглушенные и нейтральные оттенки, которые будут приятными для глаз.
- Создайте гармоничный баланс: Цветовая схема должна быть сбалансированной и гармоничной. Сочетайте цвета таким образом, чтобы они создавали единое целое и не конкурировали друг с другом.
- Используйте сложную цветовую схему с осторожностью: Сложные цветовые схемы могут быть эффектными, но их использование требует аккуратности. Избегайте слишком большого количества цветов, чтобы не создать хаос и не усложнить восприятие.
Помните, что выбор цветовой схемы является важным этапом разработки графики для трехкомпонентной системы. Цвета могут формировать впечатление о системе и ее качестве, поэтому стоит уделить им достаточно времени и внимания.
Использование градиентов и текстур
Создание эффектов градиентов и текстур может значительно улучшить визуальное впечатление от графики в трехкомпонентной системе. Градиенты могут быть использованы для создания плавных переходов цветов или добавления глубины и объемности к объектам. Текстуры, в свою очередь, позволяют добавить детали и реалистичность к рисунку.
Существует несколько способов использования градиентов и текстур, включая следующие:
- Линейные градиенты: Линейные градиенты создаются путем определения начального и конечного цветов и направления градиента. Они могут быть вертикальными, горизонтальными или диагональными. Линейные градиенты широко используются для создания эффекта объема и подсветки.
- Радиальные градиенты: Радиальные градиенты создаются путем определения центра и радиуса градиента. Они создают эффект сферической формы и могут использоваться для создания эффектов свечения или объемности.
- Угловые градиенты: Угловые градиенты создаются путем определения начального цвета и угла градиента. Они могут использоваться для создания эффекта поворота или движения идеально подходят для создания футуристического или абстрактного вида.
- Текстуры: Использование текстур позволяет добавить детали и реалистичность к графике. Текстуры могут быть созданы вручную или использовать уже существующие изображения. Они часто используются для создания эффекта фактуры или имитации поверхностей разных материалов.
При использовании градиентов и текстур важно помнить о согласованности с общим стилем графики и учитывать эстетические принципы. Умеренное использование этих эффектов может придать глубину и интерес к графике, тогда как чрезмерное использование может вызвать перегрузку и отвлечь внимание от основных элементов.
Примеры использования градиентов и текстур
Вопрос-ответ
Какие инструменты рекомендуется использовать для создания графики трехкомпонентной системы?
Для создания графики трехкомпонентной системы рекомендуется использовать специализированные программы для графического дизайна, такие как Adobe Photoshop или Illustrator. Эти инструменты предоставляют широкий набор функций и возможностей, которые могут быть полезны при создании трехкомпонентной системы.
Каким образом можно сделать графику трехкомпонентной системы привлекательной и эффективной?
Для того чтобы сделать графику трехкомпонентной системы привлекательной и эффективной, необходимо учесть несколько факторов. Во-первых, важно создать гармоничное сочетание цветов и шрифтов, чтобы элементы системы выглядели связанными между собой. Во-вторых, следует обратить внимание на простоту и понятность дизайна, чтобы пользователи легко могли взаимодействовать с трехкомпонентной системой. Наконец, важно использовать современные и инновационные дизайн-техники, чтобы сделать графику более привлекательной и выделяющейся на фоне конкурентов.
Как выбрать цветовую палитру для трехкомпонентной системы?
При выборе цветовой палитры для трехкомпонентной системы рекомендуется учитывать несколько факторов. Во-первых, следует определить основной цвет, который будет использоваться для подчеркивания ключевых элементов системы. Затем можно добавить дополнительные цвета, которые будут использоваться для отображения разных состояний или категорий. Важно также учесть психологическое воздействие цвета на пользователя и выбрать такие цвета, которые будут соответствовать имиджу и целям трехкомпонентной системы.
Каким образом можно создать эффектный и запоминающийся логотип для трехкомпонентной системы?
Для создания эффектного и запоминающегося логотипа для трехкомпонентной системы рекомендуется использовать несколько техник. Во-первых, можно использовать уникальные формы и элементы, которые будут выделяться на фоне конкурентов. Затем следует обратить внимание на выбор цветов, которые будут сочетаться с общей цветовой палитрой системы и создавать яркий и запоминающийся эффект. Наконец, важно создать простой и понятный дизайн, который легко будет узнаваться и ассоциироваться с трехкомпонентной системой.
Использование библиотеки Matplotlib. Как рисовать трехмерные графики
В этой статье мы разберемся с тем, как можно рисовать трехмерные графики функции (поверхности), а также какие настройки внешнего вида существуют.
Кроме библиотеки Matplotlib нам понадобится математическая библиотека numpy, так как некоторые методы классов рисования трехмерных графиков в качестве параметров ожидают экземпляры класса numpy.array, да и сама библиотека Numpy позволяет значительно сократить количество строк кода.
Первый трехмерный график
Для того, чтобы нарисовать трехмерный график, в первую очередь надо создать трехмерные оси. Для этого выполним короткий пример:
import matplotlib. pyplot as plt
if __name__ == ‘__main__’ :
fig = plt. figure ( )
axes = fig. add_subplot ( projection = ‘3d’ )
Чтобы создать трехмерные оси, сначала мы создаем с помощью функции figure() экземпляр класса matplotlib.figure.Figure. Затем у экземпляра этого класса вызывается метод add_subplot(), который может принимать различное количество параметров, но в данном случае мы передаем один именованный параметр — projection, который описывает тип осей. Для создания трехмерных осей значение параметра projection должно быть строкой «3d». В результате мы получим экземпляр класса осей, с которым мы будем работать в дальнейшем. Этот экземпляр принадлежит к классу, производному от Axes3D (строго говоря он имеет класс matplotlib.axes._subplots.Axes3DSubplot, но этот класс создается динамически в недрах библиотеки, поэтому его нет в документации). Через экземпляр этого класса мы будем рисовать графики и настраивать его внешний вид.
В результате выполнения приведенного выше скрипта мы увидим следующее окно с трехмерными осями, но пока без графика:
Полученные оси можно вращать мышкой.
Пришло время нарисовать что-то трехмерное в полученных осях. Для всех примеров мы будем использовать следующую функцию, от двух координат.
Для начала нужно подготовить данные для рисования. Нам понадобятся три двумерные матрицы: матрицы X и Y будут хранить координаты сетки точек, в которых будет вычисляться приведенная выше функция, а матрица Z будет хранить значения этой функции в соответствующей точке.
Сначала нужно подготовить прямоугольную сетку на плоскости XY, в узлах которой будут рассчитываться значения отображаемой функции (значение по оси Z). Для создания такой сетки можно воспользоваться функцией numpy.meshgrid(). Эта функция, в простейшем случае, принимает несколько одномерных массивов. Нам нужно два массива для осей X и Y, которые содержат значения координат узлов вдоль соответствующей оси, и могут иметь разный размер. Эта функция возвратит в нашем случае две двумерные матрицы, описывающие координаты X и Y на двумерной сетке. Первая матрица будет создана размножением первого переданного параметра в функцию numpy.meshgrid() вдоль строк первой возвращаемой матрицы, а вторая матрица создается размножением второго переданного одномерного массива вдоль столбцов второй матрицы.
Работа этой функции показана в документации к numpy на простом примере:
>>> X , Y = numpy. meshgrid ( [ 1 , 2 , 3 ] , [ 4 , 5 , 6 , 7 ] )
>>> X
array ( [ [ 1 , 2 , 3 ] ,
[ 1 , 2 , 3 ] ,
[ 1 , 2 , 3 ] ,
[ 1 , 2 , 3 ] ] )
>>> Y
array ( [ [ 4 , 4 , 4 ] ,
[ 5 , 5 , 5 ] ,
[ 6 , 6 , 6 ] ,
[ 7 , 7 , 7 ] ] )
Теперь по индексу узла сетки мы можем узнать реальные координаты: X[0][0] = 1, Y[0][0] = 4 и т.п. Такие двумерные матрицы позволяют очень легко рассчитывать значения функций от двух аргументов, используя поэлементные операции (векторизацию), это будет показано в следующем блоке кода. И кроме того, эти же матрицы требуются для рисования трехмерных поверхностей в Matplotlib.
Чтобы отделить подготовку данных от самого рисования, создание сетки и расчет функции выделим в отдельную функцию:
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
Эта функция возвращает три двумерные матрицы: x, y, z. Координаты x и y лежат на отрезке от -10 до 10 с шагом 0.1. Для задания интервала по осям X и Y мы воспользовались функцией numpy.linspace(), которая создает одномерный массив со значениями из заданного интервала [-10; 10] с указанным количеством отсчетов в нет (в нашем случае — 100). По умолчанию правый конец интервала также включается в результат (если правый конец не нужно включать в результат, то можно передать параметр endpoint, равный False).
В данном примере для простоты по осям берется четное количество отсчетов, благодаря этому особая точка с координатами (0, 0) не попадает в создаваемую сетку, поэтому дополнительная проверка не проводится. Строго говоря, именно для данной аналитической функции можно было бы воспользоваться функцией numpy.sinc(). Поскольку вычисляемая функция выбрана просто для примера, не стоит акцентировать внимание на ее математической записи.
Теперь возвращаемся непосредственно к рисованию. Чтобы отобразить наши данные, достаточно вызвать метод plot_surface() экземпляра класса Axes3D, в который передадим полученные с помощью функции makeData() двумерные матрицы.
Теперь наш пример выглядит следующим образом:
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
axes = fig. add_subplot ( projection = ‘3d’ )
# .
axes. plot_surface ( x , y , z )
Если мы запустим этот скрипт, то появится окно с такой трехмерной поверхностью:
Полученную штуку можно вращать с помощью мышки. Matplotlib не использует графический ускоритель, поэтому вращение происходит довольно медленно, хотя скорость зависит от количества точек на поверхности.
Кроме перечисленных параметров метод plot_surface() имеет дополнительные параметры, которые мы сейчас и рассмотрим.
Изменяем внешний вид графика
Шаг сетки
По умолчанию метод plot_surface() использует разрежение исходных данных, чтобы ускорить отображение. Регулировать степень разрежения (или отключить его) можно с помощью пар именованных параметров, передаваемых в метод plot_surface(). С помощью параметров rcount и ccount можно задать количество отсчетов по двум осям (по строкам и по столбцам в исходных данных соответственно). По умолчанию используются значения rcount = ccount = 50. Давайте это проверим. Для этого изменим в предыдущем примере строку с использованием метода plot_surface() следующим образом:
axes. plot_surface ( x , y , z , rcount = 50 , ccount = 50 )
При этом сетка на графике не изменится и будет, как в предыдущем примере:
Теперь сделаем сетку более мелкой, зададим количество отсчетов по обеим осям равное 100 (как раз столько, сколько у нас есть отсчетов в исходных данных):
axes. plot_surface ( x , y , z , rcount = 100 , ccount = 100 )
Результат показан на следующем рисунке:
Или сделаем сетку более редкой, изменив вызов метода plot_surface() на следующий:
axes. plot_surface ( x , y , z , rcount = 20 , ccount = 20 )
Результат будет выглядеть следующим образом:
Аналогичных результатов можно добиться, используя пары параметров rstride и cstride. Но если параметры rcount и ccount задавали количество отсчетов по осям, то rstride и cstride задают степень прореженности (децимации) по осям, то есть сколько отсчетом надо пропустить.
Как мы говорили в начале, используется сетка с 50 точками по каждой оси, а поскольку у нас в данных по 100 отсчетов, то это равносильно для наших данных значениям rstride = cstride = 2. Давайте это проверим, изменив вызов метода plot_surface() на следующий:
axes. plot_surface ( x , y , z , rstride = 2 , cstride = 2 )
В результате получим следующий график:
Он не отличается от графика, полученного с параметрами по умолчанию.
Отключим прореживаение, установив параметры rstride = cstride = 1:
axes. plot_surface ( x , y , z , rstride = 1 , cstride = 1 )
Сетка станет более мелкой:
Или наоборот уменьшим количество данных в сетке, увеличив параметры rstride и cstride:
axes. plot_surface ( x , y , z , rstride = 5 , cstride = 5 )
Результат будет выглядеть следующим образом:
Таким образом у нас есть два инструмента для изменения прореживания данных.
Изменение цвета
Теперь изменим цвет поверхности с помощью параметра color. Этот параметр представляет собой строку, которая описывает цвет. Строка цвета может задаваться разными способами:
Цвет можно определить английским словом для соответствующего цвета или одной буквой. Таких цветов не много:
- ‘b’ или ‘blue’
- ‘g’ или ‘green’
- ‘r’ или ‘red’
- ‘c’ или ‘cyan’
- ‘m’ или ‘magenta’
- ‘y’ или ‘yellow’
- ‘k’ или ‘black’
- ‘w’ или ‘white’
Для примера сделаем поверхность желтой:
axes. plot_surface ( x , y , z , color = ‘yellow’ )
Того же самого результата мы могли бы добиться, используя следующую строку:
axes. plot_surface ( x , y , z , color = ‘y’ )
Если нам нужен серый цвет, то его яркость мы можем задать с помощью строки, содержащей число в интервале от 0.0 до 1.0 (0 — белый, 1 — черный). Например, мы можем написать следующую строку:
axes. plot_surface ( x , y , z , color = ‘0.7’ )
В этом случае мы увидим такой вот серый график:
Кроме того мы можем задавать цвет так, как это принято в HTML после символа решетки (‘#’). Например, можем задать цвет следующим образом:
axes. plot_surface ( x , y , z , color = ‘#11aa55’ )
Тогда график позеленеет:
Использование цветовых карт (colormap)
Цветовые карты используются, если нужно указать в какие цвета должны окрашиваться участки трехмерной поверхности в зависимости от значения Z в этой области (задание цветового градиента). Тема использование градиентов сама по себе большая и интересная, но мы сейчас рассмотрим только некоторые ее аспекты. Чтобы при выводе графика использовался градиент, в качестве значения параметра cmap (от слова colormap — цветовая карта) нужно передать экземпляр класса matplotlib.colors.Colormap или производного от него.
Следующий пример использует класс LinearSegmentedColormap, производный от Colormap, чтобы создать градиент перехода от синего цвета к красному через белый.
import matplotlib. pyplot as plt
# .
from matplotlib. colors import LinearSegmentedColormap
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
axes = fig. add_subplot ( projection = ‘3d’ )
# .
cmap = LinearSegmentedColormap. from_list ( ‘red_blue’ , [ ‘b’ , ‘w’ , ‘r’ ] , 256 )
axes. plot_surface ( x , y , z , color = ‘#11aa55’ , cmap = cmap )
Здесь для создания цветовой карты используется статический метод from_list(), который принимает три параметра:
- Имя создаваемой карты
- Список цветов, начиная с цвета для минимального значения на графике (голубой — ‘b’), через промежуточные цвета (у нас это белый — ‘w’) к цвету для максимального значения функции (красный — ‘r’).
- Количество цветовых переходов. Чем это число больше, тем более плавный градиент, но тем больше памяти он занимает.
Результат выполнения этого скрипта выглядит следующим образом:
Если вы не хотите каждый раз создавать свою цветовую карту, то можете воспользоваться одной из уже готовых карт, которые располагаются в модуле matplotlib.cm.
Чтобы узнать какие цветовые карты существуют, можно воспользоваться следующим скриптом:
from matplotlib import cm
Например, в Matplotlib 3.4.3 вывелись следующие цветовые карты:
[‘Accent’, ‘Accent_r’, ‘Blues’, ‘Blues_r’, ‘BrBG’, ‘BrBG_r’, ‘BuGn’, ‘BuGn_r’, ‘BuPu’, ‘BuPu_r’, ‘CMRmap’, ‘CMRmap_r’, ‘Dark2’, ‘Dark2_r’, ‘GnBu’, ‘GnBu_r’, ‘Greens’, ‘Greens_r’, ‘Greys’, ‘Greys_r’, ‘LUTSIZE’, ‘MutableMapping’, ‘OrRd’, ‘OrRd_r’, ‘Oranges’, ‘Oranges_r’, ‘PRGn’, ‘PRGn_r’, ‘Paired’, ‘Paired_r’, ‘Pastel1’, ‘Pastel1_r’, ‘Pastel2’, ‘Pastel2_r’, ‘PiYG’, ‘PiYG_r’, ‘PuBu’, ‘PuBuGn’, ‘PuBuGn_r’, ‘PuBu_r’, ‘PuOr’, ‘PuOr_r’, ‘PuRd’, ‘PuRd_r’, ‘Purples’, ‘Purples_r’, ‘RdBu’, ‘RdBu_r’, ‘RdGy’, ‘RdGy_r’, ‘RdPu’, ‘RdPu_r’, ‘RdYlBu’, ‘RdYlBu_r’, ‘RdYlGn’, ‘RdYlGn_r’, ‘Reds’, ‘Reds_r’, ‘ScalarMappable’, ‘Set1’, ‘Set1_r’, ‘Set2’, ‘Set2_r’, ‘Set3’, ‘Set3_r’, ‘Spectral’, ‘Spectral_r’, ‘Wistia’, ‘Wistia_r’, ‘YlGn’, ‘YlGnBu’, ‘YlGnBu_r’, ‘YlGn_r’, ‘YlOrBr’, ‘YlOrBr_r’, ‘YlOrRd’, ‘YlOrRd_r’, DeprecatedCmapDictWrapper’, ‘__builtin_cmaps’, ‘__builtins_, _cached_, _doc_, _file_, _loader_, _name_, _package_, _spec_, ‘_api’, ‘_cmap_registry’, ‘_gen_cmap_registry’, ‘afmhot’, ‘afmhot_r’, ‘autumn’, ‘autumn_r’, ‘binary’, ‘binary_r’, ‘bone’, ‘bone_r’, ‘brg’, ‘brg_r’, ‘bwr’, ‘bwr_r’, ‘cbook’, ‘cividis’, ‘cividis_r’, ‘cmap_d’, ‘cmaps_listed’, ‘colors’, ‘cool’, ‘cool_r’, ‘coolwarm’, ‘coolwarm_r’, ‘copper’, ‘copper_r’, ‘cubehelix’, ‘cubehelix_r’, ‘datad’, ‘flag’, ‘flag_r’, ‘get_cmap’, ‘gist_earth’, ‘gist_earth_r’, ‘gist_gray’, ‘gist_gray_r’, ‘gist_heat’, ‘gist_heat_r’, ‘gist_ncar’, ‘gist_ncar_r’, ‘gist_rainbow’, ‘gist_rainbow_r’, ‘gist_stern’, ‘gist_stern_r’, ‘gist_yarg’, ‘gist_yarg_r’, ‘gnuplot’, ‘gnuplot2’, ‘gnuplot2_r’, ‘gnuplot_r’, ‘gray’, ‘gray_r’, ‘hot’, ‘hot_r’, ‘hsv’, ‘hsv_r’, ‘inferno’, ‘inferno_r’, ‘jet’, ‘jet_r’, ‘ma’, ‘magma’, ‘magma_r’, ‘mpl’, ‘nipy_spectral’, ‘nipy_spectral_r’, ‘np’, ‘ocean’, ‘ocean_r’, ‘pink’, ‘pink_r’, ‘plasma’, ‘plasma_r’, ‘prism’, ‘prism_r’, ‘rainbow’, ‘rainbow_r’, ‘register_cmap’, ‘seismic’, ‘seismic_r’, ‘spring’, ‘spring_r’, ‘summer’, ‘summer_r’, ‘tab10’, ‘tab10_r’, ‘tab20’, ‘tab20_r’, ‘tab20b’, ‘tab20b_r’, ‘tab20c’, ‘tab20c_r’, ‘terrain’, ‘terrain_r’, ‘turbo’, ‘turbo_r’, ‘twilight’, ‘twilight_r’, ‘twilight_shifted’, ‘twilight_shifted_r’, ‘unregister_cmap’, ‘viridis’, ‘viridis_r’, ‘winter’, ‘winter_r’]
Как эти цветовые карты выглядят, можно увидеть на этой странице документации.
Воспользуемся некоторыми из них. Следующий пример строит два трехмерных графика в одном окне. Для левого графика цветовая карта jet, а для правого — Spectral.
# .
from matplotlib. colors import LightSource
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
zgrid = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , zgrid
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( figsize = ( 10 , 8 ) )
axes_1 = fig. add_subplot ( 1 , 2 , 1 , projection = ‘3d’ )
axes_2 = fig. add_subplot ( 1 , 2 , 2 , projection = ‘3d’ )
# .
axes_1. plot_surface ( x , y , z , cmap = ‘jet’ )
axes_1. set_title ( «cmap=’jet'» )
# .
axes_2. plot_surface ( x , y , z , cmap = ‘Spectral’ )
axes_2. set_title ( «cmap=’Spectral'» )
В результате будут показаны следующие трехмерные графики:
Настройка цвета и толщины линий
Иногда бывает полезно для наглядности сделать более выделяющимися линии сетки трехмерной поверхности. Цвет линий в методе plot_surface() можно задавать с помощью именованного параметра edgecolors, а толщину линий — с помощью параметра linewidth.
Следующий пример делает линии сетки более жирными и черными. Для наглядности сетка в этом примере сделана более редкой с помощью обсуждавшихся выше параметров rcount и ccount, а для раскраски поверхности с помощью параметра cmap задается цветовая карта с именем «jet».
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
axes = fig. add_subplot ( projection = ‘3d’ )
# .
axes. plot_surface ( x , y , z , rcount = 40 , ccount = 40 , cmap = ‘jet’ ,
linewidth = 0.5 , edgecolors = ‘k’ )
Результат показан на следующем рисунке:
Установка точки наблюдения
Хотя трехмерный график можно вращать с помощью мышки, но также есть возможность установить точку наблюдения, которая будет установлена по умолчанию. По умолчанию точка наблюдения установлена в точке, которая имеет угловые координаты: азимут (azimuth) равен -60°, а угол места (elevation) равен 30°. Для изменения положения точки наблюдения предназначен метод view_init() из класса Axes3D. Этот метод принимает два параметра: elev — угол места и azim — азимут. Оба угла задаются в градусах. Каждый из этих параметров может принимать значение None, в этом случае данная угловая координата будет изменена на значение по умолчанию.
Следующий пример устанавливает значение азимута, равным 0°, а угол места равным 45°. Для большей наглядности оформление графика взято из предыдущего примера, а также добавлены имена осей с помощью методов set_xlabel() и set_ylabel().
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
axes = fig. add_subplot ( projection = ‘3d’ )
# .
axes. plot_surface ( x , y , z , cmap = ‘jet’ , rcount = 40 , ccount = 40 ,
linewidth = 0.5 , edgecolors = ‘k’ )
axes. view_init ( elev = 45 , azim = 0 )
axes. set_xlabel ( ‘X’ )
axes. set_ylabel ( ‘Y’ )
Результат выполнения этого скрипта показан на следующем рисунке:
Также координаты точки наблюдения можно указать при создании осей, передав одноименные параметры в метод add_subplot(), что показано в следующем примере:
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
# .
axes = fig. add_subplot ( projection = ‘3d’ , elev = 45 , azim = 0 )
# .
axes. plot_surface ( x , y , z , cmap = ‘jet’ , rcount = 40 , ccount = 40 ,
linewidth = 0.5 , edgecolors = ‘k’ )
axes. set_xlabel ( ‘X’ )
axes. set_ylabel ( ‘Y’ )
Внешний вид графика в этом случае будет точно таким же, как и в предыдущем примере
Надо сказать, что в в данном методе координаты азимут и угол места отсчитываются не совсем так, как это принято в классических системах координат. Азимут отсчитывается не от оси X, которая начинается в начале координат, в сторону оси Y, а от линии, параллельной оси X, которая исходит из центра трехмерной фигуры, этот угол также отсчитывается в сторону оси Y. А угол места отсчитывается не от плоскости OXY, которая проходит через плоскость Z = 0, а от нижней плоскости осей для данной трехмерной фигуры. Чтобы это показать, в следующем примере отображаемая функция смещена по осям Y и Z, но при этом азимут и угол места заданы, как в предыдущем примере. То есть система координат для положения точки наблюдения привязана не к началу системы координат графика, а к отображаемой области, что в общем-то логично с точки зрения пользователя.
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 5 , 15 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid — 5 ) / ( xgrid * ( ygrid — 5 ) ) — 5
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( )
# .
axes = fig. add_subplot ( projection = ‘3d’ , elev = 45 , azim = 0 )
# .
axes. plot_surface ( x , y , z , cmap = ‘jet’ , rcount = 40 , ccount = 40 ,
linewidth = 0.5 , edgecolors = ‘k’ )
axes. set_xlabel ( ‘X’ )
axes. set_ylabel ( ‘Y’ )
Результат выглядит следующим образом:
Источник света
Для большей натуралистичности и визуальной привлекательности при построении трехмерных поверхностей используется неравномерное освещение трехмерных объектов (затенение). Если нужно сделать отображаемый график более «плоским», то затенение можно отключить, и тогда освещенность всех элементов трехмерной поверхности будет одинаковая. Для этого в метод plot_surface() нужно передать именованный параметр shade, равный значению False. Затенение автоматически отключается, если используется цветовая карта, которая устанавливается с помощью параметра cmap.
Следующий пример отображает два трехмерных графика в одном окне, чтобы можно было увидеть разницу между включенным и отключенным затенением.
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( figsize = ( 10 , 8 ) )
axes_shade = fig. add_subplot ( 1 , 2 , 1 , projection = ‘3d’ )
axes_no_shade = fig. add_subplot ( 1 , 2 , 2 , projection = ‘3d’ )
axes_shade. plot_surface ( x , y , z , rcount = 40 , ccount = 40 , shade = True )
axes_shade. set_title ( «shade=True (default)» )
axes_no_shade. plot_surface ( x , y , z , rcount = 40 , ccount = 40 , shade = False )
axes_no_shade. set_title ( «shade=False» )
Результат выглядит следующим образом:
Но если сделать более выделяющуюся сетку, как было описано в разделе Настройка цвета и толщины линий, то визуально разница будет уже не столь существенная:
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( figsize = ( 10 , 8 ) )
axes_shade = fig. add_subplot ( 1 , 2 , 1 , projection = ‘3d’ )
axes_no_shade = fig. add_subplot ( 1 , 2 , 2 , projection = ‘3d’ )
axes_shade. plot_surface ( x , y , z , rcount = 40 , ccount = 40 ,
linewidth = 0.5 , edgecolors = ‘k’ , shade = True )
axes_shade. set_title ( «shade=True (default)» )
axes_no_shade. plot_surface ( x , y , z , rcount = 40 , ccount = 40 ,
linewidth = 0.5 , edgecolors = ‘k’ , shade = False )
axes_no_shade. set_title ( «shade=False» )
Если используется затенение, то можно установить источник света таким образом, чтобы он освещал поверхность с определенного направления. Чтобы установить источник света, в метод plot_surface() нужно передать параметр lightsource, который должен быть экземпляром класса matplotlib.colors.LightSource. Конструктор этого класса принимает два основных параметра (на самом деле больше, но остальные параметры оставлены только для совместимости со старыми версиями библиотеки): азимут (azdeg) и угол места (altdeg). Все углы задаются в градусах.
Следующий пример показывает разницу в отображении графиков при различных положениях источника света:
# .
from matplotlib. colors import LightSource
import matplotlib. pyplot as plt
def makeData ( ) :
# Строим сетку в интервале от -10 до 10, имеющую 100 отсчетов по обоим координатам
x = numpy. linspace ( — 10 , 10 , 100 )
y = numpy. linspace ( — 10 , 10 , 100 )
# Создаем двумерную матрицу-сетку
xgrid , ygrid = numpy. meshgrid ( x , y )
# В узлах рассчитываем значение функции
z = numpy. sin ( xgrid ) * numpy. sin ( ygrid ) / ( xgrid * ygrid )
return xgrid , ygrid , z
if __name__ == ‘__main__’ :
x , y , z = makeData ( )
fig = plt. figure ( figsize = ( 10 , 8 ) )
axes_1 = fig. add_subplot ( 1 , 2 , 1 , projection = ‘3d’ )
axes_2 = fig. add_subplot ( 1 , 2 , 2 , projection = ‘3d’ )
light_1 = LightSource ( azdeg = 300 , altdeg = 45 )
light_2 = LightSource ( azdeg = 60 , altdeg = 15 )
axes_1. plot_surface ( x , y , z , rcount = 40 , ccount = 40 ,
lightsource = light_1 )
axes_1. set_title ( ‘azdeg=300, altdeg=45’ )
axes_2. plot_surface ( x , y , z , rcount = 40 , ccount = 40 ,
lightsource = light_2 )
axes_2. set_title ( ‘azdeg=60, altdeg=15’ )
Результат выглядит следующим образом:
Кроме рисования трехмерных поверхностей в Matplotlib существует возможность рисования точек и линий в трехмерном пространстве, трехмерных гистограмм и плоских фигур в трехмерном пространстве. Но это уже темы для отдельных статей.
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.