Рубрики
Без рубрики

Узнайте основы 3D-участков в MatPlotlib – как сделать линию и рассеивание, добавить этикетки оси, легенды и изменить цвет фона [+ бонусное видео]

Узнайте основы 3D-участков в MatPlotlib – как сделать линию и рассеивание, добавить этикетки оси, легенды и изменить цвет фона [+ бонусное видео]

Автор оригинала: Adam Murphy.

Вы устали с тем же старыми 2D-участками? Вы хотите принять свои участки на следующий уровень? Ну не посмотрите дальше, пришло время узнать, как сделать 3D участки в Матплотлиб Отказ

В дополнение к Импорт matplotlib.pyplot как PLT и звонить PLT.Show () , чтобы создать 3D участок в Matplotlib, вам нужно:

  1. Импорт AXES3D объект
  2. Инициализировать свой Рисунок и AXES3D объекты
  3. Получите некоторые 3D-данные
  4. Сюжет его, используя Оси Нотации и стандартные вызовы функций
# Standard import
import matplotlib.pyplot as plt

# Import 3D Axes 
from mpl_toolkits.mplot3d import axes3d

# Set up Figure and 3D Axes 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Get some 3D data
X = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Y = [2, 5, 8, 2, 10, 1, 10, 5, 7, 8]
Z = [6, 3, 9, 6, 3, 2, 3, 10, 2, 4]

# Plot using Axes notation and standard function calls
ax.plot(X, Y, Z)
plt.show()

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

Попробуйте сами нашей интерактивной раковине Python. Просто выполните код и посмотрите на созданный файл «Plot.png»:

MATPLOTLIB 3D пример участка

Если вы привыкли построить с Рисунок и Оси Обозначение, делающие 3D участки в Matplotlib практически идентичны создавать 2D. Если вам не удобно Рисунок и Оси Обозначение построения, проверьте это статья, чтобы помочь вам.

Помимо стандарта Импорт matplotlib.pyplot как PLT , вы также должны от mpl_toolkits.mplot3d Import AXES3D Отказ Это импортирует 3D Оси Объект, на котором A) Вы можете с участием 3D-данные и B) вы сделаете все свои вызовы сюжетов в отношении.

Вы настроили свой Рисунок Стандартный путь

fig = plt.figure()

И добавьте подломы на эту цифру, используя стандарт fig.add_subplot () метод. Если вы просто хотите один Оси , пройти 111 Чтобы указать, что это 1 строка, 1 столбец, и вы выбираете 1-й. Тогда вам нужно пройти Проекция = «3D» который говорит Matplotlib это 3D-участк.

Отныне все есть (почти) так же, как 2D построение. Все функции, которые вы знаете и любят, такие как AX.PLOT () и AX.SCatter () Принять одинаковые ключевые аргументы, но теперь они также принимают три позиционных аргумента – Х , Y и Z Отказ

В некоторых способах 3D участки более естественны для нас работать с тех пор, как мы живем в трехмерном мире. С другой стороны, они более сложны, так как мы так используются для 2D участков. Одна удивительная особенность ноутбуков Jupyter – это волшебная команда % matplotlib ноутбук Который, если пробежал в верхней части своего ноутбука, рисует все свои участки в интерактивном окне. Вы можете изменить ориентацию, нажав и перетащив (щелкните правой кнопкой мыши и перетащите, чтобы увеличить), которые действительно могут помочь понять ваши данные.

Поскольку это статический пост в блоге, все мои участки будут статичными, но я призываю вас играть в своем собственном jupyter или inpython.

Связанная статья:

  • Проверьте вашу версию Python в ноутбуке Jupyter.

MATPLOTLIB 3D Правящий график

Вот пример силы 3D линейных участков, использующих всю информацию выше.

# Standard imports
import matplotlib.pyplot as plt
import numpy as np

# Import 3D Axes 
from mpl_toolkits.mplot3d import axes3d

# Set up Figure and 3D Axes 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Create space of numbers for cos and sin to be applied to
theta = np.linspace(-12, 12, 200)
x = np.sin(theta)
y = np.cos(theta)

# Create z space the same size as theta 
z = np.linspace(-2, 2, 200)

ax.plot(x, y, z)
plt.show()

Чтобы избежать повторения, я не буду объяснять точки, которые я уже сделал выше о импорте и настройке Рисунок и Оси объекты.

Я создал переменную Тета Использование np.linspace Что возвращает массив 200 чисел между -12 и 12, которые одинаково расположены I.E. Есть линейное расстояние между ними все. Я передал это на np.sin () и np.cos () и сохранил их в переменных х и y Отказ

Если вы просто построены х и y Теперь вы получите круг. Чтобы получить движение вверх/вниз, вам нужно изменить ось Z. Итак, я использовал np.linspace Опять же, чтобы создать список 200 чисел одинаково расположенных между -2 и 2, которые можно увидеть, глядя на ось Z (вертикальный).

Примечание. Если вы выбираете меньшее количество значений для np.linspace Участок не так гладко.

Для этого сюжета я установил третий аргумент np.linspace до 25 вместо 200. Очевидно, этот участок гораздо менее гладкий, чем оригинал, и, надеюсь, дает вам понимание того, что происходит под капотом с этими участками. 3D участки могут поначалу казаться пугающими, поэтому мой лучший совет должен пройти через строку кода по линии.

Статьи по Теме:

  • Как начать изучать Python
  • MATPLOTLIB 3D участник [Часть 1/2]
  • MATPLOTLIB 3D участок [часть 2/2]

MATPLOTLIB 3D сюжет разброс

Создание графика разброса точно такой же, как сделать линий сюжет, но вы звоните AX.SCatter вместо.

Вот прохладный участок, который я адаптировал из это видео. Если вы обрабатываете нормальное распределение и создайте от него 3D-график, вы получаете мяч точек с большинством, ориентированным на центре и меньше и меньше, чем дальше от центра, который вы идете.

import random
random.seed(1)

# Create 3 samples from normal distribution with mean and standard deviation of 1
x = [random.normalvariate(1, 1) for _ in range(400)]
y = [random.normalvariate(1, 1) for _ in range(400)]
z = [random.normalvariate(1, 1) for _ in range(400)]

# Set up Figure and Axes
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Plot
ax.scatter(x, y, z)
plt.show()

Во-первых, я импортировал Python Случайный модуль И установите семена, чтобы вы могли воспроизвести мои результаты. Далее я использовал три понятия для создания 3 × 400 образцов нормального распределения с использованием Random.normalVariate () функция. Тогда я настроил Рисунок и Оси как обычно и сделал мой участок, позвонив AX.SCatter () Отказ

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z)
plt.show()

В этом примере я нанесен тот же Х , Y и Z списки как в самом первом примере. Я хочу подчеркнуть вам, что некоторые из точек темнее, а некоторые более прозрачные – это указывает на глубину. Те, которые более темные в цвете, на переднем плане, а те, кто возвращается снова.

Если вы построчате это в iPython или в окне интерактивного ноутбука Jupyter, и вы поверните график, вы увидите, что прозрачность каждой точки изменяется, когда вы вращаете.

MATPLOTLIB 3D График вращается

Самый простой способ вращать 3D-участки – это отображать их в интерактивном окне, используя команду Jupyter Magic Magic % matplotlib ноутбук Или использовать iPython (который всегда отображает графики в интерактивных окнах). Это позволяет вручную вращать их, щелкнув и перетаскивая. Если вы щелкните правой кнопкой мыши и переместите мышь, вы будете увеличить и выходить из сюжета. Чтобы сохранить статическую версию сюжета, нажмите значок Сохранить.

Можно вращать графики и даже создавать анимацию через код, но выходит из объема этой статьи.

MATPLOTLIB 3D сюжет оси этикетки

Установка меток оси для трехмерных участков идентична для 2D заговоров, за исключением которых сейчас есть третий ось – ось Z – вы можете метить.

У вас есть 2 варианта:

  1. Используйте AX.SET_XLABEL () , AX.SET_YLABEL () и AX.SET_ZLABEL () Методы или
  2. Используйте AX.SET () Способ и пропустите аргументы ключевых слов xlabel , YLABEL и Zlabel Отказ

Вот пример, используя первый метод.

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z)

# Method 1
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

plt.show()

Теперь каждая ось помечена как ожидалось.

Вы можете заметить, что этикетки оси не особенно видны, используя настройки по умолчанию. Вы можете решить это, вручную увеличив размер Рисунок с фигес Аргумент в вашем PLT.Figure () вызов.

Одна вещь, которую мне не нравится в методе 1, заключается в том, что он занимает 3 строки кода, и они скучно, чтобы ввести. Итак, я предпочитаю метод 2.

# Set Figure to be 8 inches wide and 6 inches tall
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z)

# Method 2 - set all labels in one line of code!
ax.set(xlabel='X axis', ylabel='Y axis', zlabel='Z axis')

plt.show()

Намного лучше! Во-первых, потому что вы увеличили размер Рисунок Все этикетки оси хорошо видны. Плюс, он достал вам только одну линию кода, чтобы пометить их всех. В общем, если вы когда-нибудь используете AX.SET_ <Что-то> () Способ в Matplotlib, его можно записать как AX.SET (<что-то> =) вместо. Это сохраняет вам пространство и приятнее ввести, особенно если вы хотите сделать многочисленные модификации на график, такие как также добавление заголовка.

MATPLOTLIB 3D График легенды

Вы добавляете легенды в 3D графики точно так же, как вы добавляете Легенды к любым другим участкам. Используйте этикетка Аргумент ключевых слов, а затем звоните AX.LEGEND () в конце.

import random

random.seed(1)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Plot and label original data
ax.scatter(X, Y, Z, label='First Plot')

# Randomly re-order the data
for data in [X, Y, Z]:
    random.shuffle(data)

# Plot and label re-ordered data
ax.scatter(X, Y, Z, label='Second Plot')

ax.legend(loc='upper left')
plt.show()

В этом примере я впервые установил случайное семена на 1, чтобы вы могли воспроизвести те же результаты, что и я. Я настроил Рисунок и Оси Как и ожидалось, сделал мой первый трехмерный участок, используя Х , Y и Z и пометил это с этикетка Аргумент ключевых слов и соответствующая строка.

Чтобы спасти меня из вручную, создавая совершенно новый набор данных, я думал, что было бы хорошей идеей, чтобы использовать данные, которые у меня уже имели. Итак, я применил Random.shuffle () Функция для каждого из Х , Y и Z которые смешивают значения списков на месте. Итак, позвонив AX.PLOT () Второй раз, нанесенный теми же номерами, но в другом порядке, таким образом, создавая другой сюжет. Наконец, я пометил второй сюжет и называл AX.LEGEND (LOC = «ВНЕШНИЙ ЛВОЛ») отображать легенду в верхнем левом углу сюжета.

Все обычные вещи, которые вы можете сделать с легендами, все еще возможны для трехмерных участков. Если вы хотите узнать больше, чем эти основные шаги, проверьте мое всеобъемлющее руководство по легендам в MatPlotlib.

Примечание. Если вы снова запустите вышеуказанный код, вы получите другой сюжет. Это потому, что вы начнете с перетасовки Х , Y и Z списки, а не оригиналы, которые вы создали дальше вверх по почте.

MATPLOTLIB 3D График Цвет фона

Есть два фона, которые вы можете изменить в MatPlotlib – Рисунок и Оси задний план. Оба могут быть установлены, используя либо .et_faceColor («Цвет») или .et (FaceColor = 'Color') методы. Надеюсь, вы знаете, что теперь я предпочитаю второй метод в течение первого!

Вот пример, где я установил Рисунок Цвет фона до зеленого и Оси Цвет фона до красного.

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.plot(X, Y, Z)

# Axes color is red
ax.set(facecolor='r')
# Figure color is green
fig.set(facecolor='g')
plt.show()

Первые три строки такие же, как простая строка. Тогда я позвонил AX.SET (FACECOLOR = 'R') Чтобы установить Оси Цвет к красному и fig.set (faceColor = 'g') Чтобы установить Рисунок Цвет зеленого.

В примере с одним Оси это выглядит немного странно, чтобы установить Рисунок и Оси Цвета отдельно. Если у вас есть более одного Оси Объект, это выглядит намного лучше.

# Set up Figure and Axes in one function call
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 6), 
                         subplot_kw=dict(projection='3d'))

colors = ['r', 'g', 'y', 'b']

# iterate over colors and all Axes objects
for c, ax in zip(colors, axes.flat):
    ax.plot(X, Y, Z)
    # Set Axes color
    ax.set(facecolor=c)

# Set Figure color
fig.set(facecolor='pink')
plt.show()

В этом примере я использовал plt.subplots () Чтобы настроить 8 × 6 дюймов Рисунок содержащий четыре 3D Оси Объекты в сетке 2 × 2. subplot_kw Аргумент принимает словарь значений, и их передаются на add_subplot . сделать каждый Оси объект. Для получения дополнительной информации об использовании plt.subplots () Проверьте Моя статья Отказ

Тогда я создал список Цвета содержащий 4 цветных струн MATPLOTLIB. После этого я использовал цикл для петли, чтобы повторять Цвета и AXES.FLAT Отказ Для того, чтобы повторять над Цвета и оси Вместе они должны быть одинаковыми формой. Есть несколько способов сделать это, но используя .flat Атрибут хорошо работает в этом случае.

Наконец, я сделал тот же сюжет на каждом Оси и установить емкости. Теперь ясно, почему установить Рисунок Цвет может быть более полезен, если вы создаете подломы – есть больше места для цвета, чтобы сиять.

MATPLOTLIB 3D участок продвинутый

Если вы уже узнали, как сделать основные 3D-участки в Maptlotlib и хотите взять их на следующий уровень, то не смотрите дальше. В следующем, я научу вас создать два самых распространенных трехмерных участка (поверхностные и каркасные участки) и пошаговый метод, который вы можете использовать для создания любой формы, которую вы можете себе представить.

В дополнение к Импорт matplotlib.pyplot как PLT и звонить PLT.Show () , чтобы создать 3D участок в Matplotlib, вам нужно:

  1. Импорт AXES3D объект
  2. Инициализировать свой Рисунок и AXES3D объект
  3. Получите некоторые 3D-данные
  4. Сюжет его, используя Оси обозначение

Вот каркасный сюжет:

# Standard import
import matplotlib.pyplot as plt

# Import 3D Axes
from mpl_toolkits.mplot3d import axes3d

# Set up Figure and 3D Axes
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Get some data
X, Y, Z = axes3d.get_test_data(0.1)

# Plot using Axes notation
ax.plot_wireframe(X, Y, Z)
plt.show()

Попробуйте сами на нашей интерактивной оболочке Python (и проверьте файл ‘plot.png’ ):

Изменение вызова сюжета на ax.plot_surface (x, y, z) дает

Большой! Вы только что создали свои первые 3D каркасные и поверхностные участки. Не волнуйтесь, если это было немного быстро; Давайте погрузимся в более подробный пример.

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

import seaborn as sns; sns.set()

MATPLOTLIB 3D Участок Усовершенствованный пример

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

Самая сложная часть создания поверхностных и каркажных участков – шаг 3: Получение 3D-данных. Matplotlib на самом деле включает в себя функцию помощника AXES3D.GET_TEST_DATA () создать некоторые данные для вас. Он принимает поплавок и, для достижения наилучших результатов, выберите значение между 0 и 1. Он всегда дает тот же сюжет, но разные поплавки дают вам данные разных размеров и, таким образом, влияют на то, как подробнее сюжет.

Тем не менее, лучший способ выучить 3D-построение – создать пользовательские участки.

В конце шага 3 вы хотите иметь три Numpy массивы Х , Y и Z , который вы перейдете к AX.PLOT_WIREFRAME () или ax.plot_surface () Отказ Вы можете сломать шаг 3 на четыре шага:

  1. Определите пределы оси X Axis и Y
  2. Создайте сетку XY-точек (чтобы получить X и Y)
  3. Определите Z-функцию
  4. Примените Z-функцию на x и y (чтобы получить z)

В MatPlotlib Axis Z вертикальна по умолчанию. Итак, «дно» AXES3D Объект – это сетка очков XY. Для поверхностных или каркажных участков каждой пары точек XY имеет соответствующее значение Z. Итак, мы можем подумать о поверхностных/каркажных разах в качестве результата нанесения некоторой Z-функции для каждой пары XY на «нижней части» AXES3D объект.

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

Чтобы создать свои темы XY, сначала необходимо определить пределы оси X Axis и Y. Покажем, вы хотите, чтобы X-значения в диапазоне от -5 до +5 и Y-значений от -2 до +2. Вы можете создать массив номеров для каждого из них, используя np.linspace () функция. По причинам, которые станут ясными позже, я сделаю х иметь 100 очков, а y иметь 70.

x = np.linspace(-5, 5, num=100)
y = np.linspace(-2, 2, num=70)

Оба х и y 1D массивы, содержащие Num одинаково разнесенные поплавки в диапазонах [-5, 5] и [-2, 2] соответственно.

Поскольку XY-самолет представляет собой 2D-объект, вам теперь нужно создать прямоугольную сетку всех паре XY. Для этого используйте numpy Функция np.meshgrid () Отказ Требуется N 1D массивы и превращает их в N-мерную сетку. В этом случае требуется две 1-й массивы и превращает их в 2D сетку.

X, Y = np.meshgrid(x, y)

Теперь вы создали Х и Y Так что давайте осмотрим их.

print(f'Type of X: {type(X)}')
print(f'Shape of X: {X.shape}\n')
print(f'Type of Y: {type(Y)}')
print(f'Shape of Y: {Y.shape}')
Type of X: 
Shape of X: (70, 100)

Type of Y: 
Shape of Y: (70, 100)

Оба Х и Y Обмочненные массивы одной и той же формы: (70, 100) Отказ Это соответствует размеру y и х соответственно. Как вы ожидаете, размер y Диктует высоту массива, то есть количество строк и размер х Диктует ширину, то есть количество столбцов.

Обратите внимание, что я использовал строчные буквы х и y Для 1D массивов и заглавных букв Х и Y для 2D массивов. Это стандартная практика при изготовлении трехмерных участков, и я использую его по всей статье.

Теперь вы создали свою сетку очков; Пришло время определить функцию, чтобы подать заявку на них все. Поскольку эта функция выводит значения Z, я называю его Z-функцией. Общие Z-функции содержать np.sin () и np.cos () Поскольку они создают повторение, циклические узоры, которые выглядят интересными, когда это нанесено в 3D. Кроме того, Z-функции обычно объединяют оба Х и Y Переменные в качестве 3D-участков видят, как все переменные взаимодействуют.

# Define z-function with 2 arguments: x and y
def z_func(x, y):
    return np.sin(np.cos(x) + y)

# Apply to X and Y
Z = z_func(X, Y)

Здесь я определил Z-функцию, которая принимает 2 переменных – х и y – и это комбинация np.sin () и np.cos () Функции. Тогда я применил это к Х и Y Чтобы получить Z множество. Благодаря Numpy вещание Python Python применяет Z-функцию для каждой пары XY почти мгновенно и спасает вас от необходимости написать дико неэффективное для петля.

Обратите внимание, что Z такая же форма и тип, как и как Х и Y Отказ

print(f'Type of Z: {type(Z)}')
print(f'Shape of Z: {Z.shape}')
Type of Z: 
Shape of Z: (70, 100)

Теперь, когда у вас есть данные, все, что осталось сделать, это сделать участки. Давайте поставим все вышеупомянутый код вместе:

# Set up Figure and 3D Axes
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Create x and y 1D arrays
x = np.linspace(-5, 5, num=100)
y = np.linspace(-2, 2, num=70)

# Create X and Y 2D arrays
X, Y = np.meshgrid(x, y)

# Define Z-function
def z_func(x, y): return np.sin(np.cos(x) + y)

# Create Z 2D array
Z = z_func(X, Y)

# Plot using Axes notation
ax.plot_wireframe(X, Y, Z)
# Set axes lables
ax.set(xlabel='x', ylabel='y', zlabel='z')
plt.show()

Отлично, я нашел вышеуказанный участок, играя с разными Z-функциями и думаю, что это выглядит довольно круто! Z-функции, содержащие np.log () , np.exp () , np.sin () , np.cos () и комбинации х и y Обычно приводит к интересным участкам – я призываю вас экспериментировать сами.

Теперь я создам 3 разных Z-функция с тем же Х и Y Как и раньше и создать подпункту из них, чтобы вы могли видеть различия.

# Set up Figure and Axes
fig, axes = plt.subplots(1, 3, subplot_kw=dict(projection='3d'),
                        figsize=plt.figaspect(1/3))

# Create 3 z-functions
def z_1(x, y): return np.exp(np.cos(x)*y)
def z_2(x, y): return np.log(x**2 + y**4)
def z_3(x, y): return np.sin(x * y)

# Create 3 Z arrays 
Z_arrays = [z_1(X, Y), z_2(X, Y), z_3(X, Y)]
# Titles for the plots
z_func_names = ['np.exp(np.cos(x)*y)', 'np.log(x**2 + y**4)', 'np.sin(x * y)']

# Plot all 3 wireframes
for Z_array, z_name, ax in zip(Z_arrays, z_func_names, axes):
    ax.plot_wireframe(X, Y, Z_array)
    ax.set(title=z_name)
plt.show()

Я думаю, что все эти изображения продемонстрируют силу 3D-построения, и я надеюсь, что они побуждают вас создать свои собственные.

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

MATPLOTLIB 3D сюжет

Сделать карточный сюжет, позвоните AX.PLOT_WIREFRAME (X, Y, Z) Отказ Эти участки дают вам обзор поверхности. Кроме того, вы можете увидеть их более легко идентифицировать пики и впадины, которые в противном случае могут быть скрыты.

Участок карта Warrame работает только путем построения образец переданных данных. Вы можете изменить, насколько большинся образцы с 4 аргументами ключевых слов:

  1. Rstride и Cstride , или же
  2. RCONT и ccount.

R и C стоять за ряд и Колонка соответственно. Разница между ними похожа на разницу между NP.Arge () и np.linspace () Отказ

шаг Аргументы по умолчанию 1 и установите размеры шага между каждой образцовой точкой. Шаг из 1 означает, что каждое значение выбрано, а шайд 10 означает, что каждое 10-е значение выбирается. Таким образом, это похоже на NP.Arge () где вы выбираете размер шага. Более больший шаг означает меньше значений, поэтому ваш сюжет отображается быстрее и менее подробно.

Считать Аргументы по умолчанию до 50 и установите количество (одинаково разнесенных) строк/столбцов выборки. Количество 1 означает, что вы используете 1 строк/столбец, а количество 100 означает, что вы используете 100. Таким образом, он похож на np.linspace () Где вы выбираете общее количество значений с Num Ключевое слово аргумент. Большое количество означает, что выбираются больше значений, поэтому ваш график отображается медленнее и более подробно.

Matplotlib Docs Скажи, что вы должны использовать Считать аргументы. Тем не менее, оба все еще доступны, и это не похоже на шаг Аргументы будут амортизироваться в ближайшее время. Примечание, хотя, что вы не можете использовать оба Считать и шаг И если вы попытаетесь сделать это, это ValueError Отказ

Установив любой из аргументов ключевых слов к 0, вы не проба данных вдоль этой оси. Результатом является то 3D линейный график, а не каркас.

Чтобы продемонстрировать различия между различными отсюдами или шагами, я создаю subplot с тем же Х , Y и Z Массивы как первый пример, но с разными шаг и Считать значения.

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))
# Same as first example
x = np.linspace(-5, 5, num=100)
y = np.linspace(-2, 2, num=70)
X, Y = np.meshgrid(x, y)

def z_func(x, y): return np.sin(np.cos(x) + y)
Z = z_func(X, Y)

# Define different strides
strides = [1, 5, 10]

for stride, ax in zip(strides, axes.flat):
    ax.plot_wireframe(X, Y, Z, rstride=stride, cstride=stride)
    ax.set(title=f'stride={stride}')

plt.show()    

Здесь вы можете увидеть, что больший шаг производит менее подробный карточный график. Обратите внимание, что Stride = 1 По умолчанию и невероятно подробно описан для участка, который должен дать общий обзор данных.

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))

counts = [5, 20, 50]

for count, ax in zip(counts, axes.flat):
    # Use same data as the above plots
    ax.plot_wireframe(X, Y, Z, rcount=count, ccount=count)
    ax.set(title=f'count={count}')

plt.show()

Здесь вы видите, что большее количество производит более подробный карточный график. Обратите внимание, что по умолчанию count = 50 производит очень подробный сюжет.

Другие аргументы ключевых слов передаются на LineCollection Отказ Таким образом, вы также можете изменить Цвет (с) и Linestyle (Ls) среди других вещей.

MATPLOTLIB 3D Площадь поверхности

Сделать поверхностный участок звонка ax.plot_surface (x, y, z) Отказ Поверхностные участки такие же, как каркасные сюжеты, за исключением того, что пробелы между линиями окрашены. Кроме того, есть некоторые дополнительные аргументы ключевых слов, которые вы можете использовать, что может добавить тонну значений на график.

Во-первых, давайте сделаем те же участки, что и выше, с настройками графика поверхности по умолчанию и разные RCONT и CCONT значения.

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))

counts = [5, 20, 50]

for count, ax in zip(counts, axes.flat):
    # Use same data as the above plots
    surf = ax.plot_surface(X, Y, Z, rcount=count, ccount=count)
    ax.set(title=f'count={count}')

plt.show()

В отличие от раковины каркаса, пространство между каждой линией заполнено синим цветом. Обратите внимание, что участки получают белее как Считать становится больше. Это связано с тем, что линии белые, и, как увеличивается подсчет, на каждом участке больше линий. Вы можете изменить это, установив Сландвидность или LW Аргумент для меньшего количества таких, как 0,1 или даже 0.

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, linewidth=0)

ax.set(title="linewidth=0")
plt.show()

Намного приятнее! Теперь вы можете увидеть цвет участка, а не цвет линий. Можно почти полностью удалить линии, установив Антициальные = ложь Отказ

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

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, linewidth=0, antialiased=False)

ax.set(title="linewidth=0, antialiased=False")
plt.show()

Теперь поверхность немного менее гладкая, и поэтому вы не можете видеть линии.

MATPLOTLIB 3D Участок поверхности CMAP

Возможно, самый важный аргумент ключевых слов для поверхностных участков является CMAP которые устанавливают сормер. Когда вы смотрите на поверхностный график от разных углов, имея Colormap, вы понимаете, какие части поверхности – это где. Обычно вы хотите, чтобы высокие точки были один цвет (например, оранжевый) и низкие точки, чтобы быть другим (например, черный). Наличие двух различных цветов особенно полезно, если вы посмотрите на участок с разных углов (которые я покажу вам, как делать в на мгновение).

Есть множество Colormaps в Matplotlib и вы можете увидеть несколько использованных в моей статье о matplotlib imshow функция.

Теперь я буду настроить те же данные, что и выше, но установите Colormap на медь Отказ

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

ax.plot_surface(X, Y, Z, lw=0, cmap='copper')
plt.show()

Colormap медь Карты больших Z-значений в оранжевые и меньшие черные.

Теперь я буду использовать 3 разных и обычно используемых Colormaps для того же сюжета, чтобы дать вам представление о том, как цвет может помочь и (массивно) препятствовать ваши участки.

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))

cmaps = ['copper', 'coolwarm', 'jet']

for cmap, ax in zip(cmaps, axes):
    ax.plot_surface(X, Y, Z, lw=0, cmap=cmap)
    ax.set(title=f'{cmap}')
plt.show()

CoolWarm Colormap работает хорошо, если вы хотите выделить чрезвычайно высокие и чрезвычайно низкие точки. Это Нетехническая бумага Определяет сормер, похожий на CoolWarm И утверждает, что это должен быть CMap по умолчанию для всех работ по науке о данных.

Jet Colormap хорошо известен и является ужасным выбором для всех ваших потребностей заговором. Он содержит так много цветов, что человеку трудно узнать, что соответствует высоким, низким или средним точкам. Я включил его в качестве примера здесь, но призываю вас к никогда не Используйте его в любом из ваших участков.

Теперь давайте посмотрим, как Считать и шаг Аргументы могут повлиять на цвет ваших поверхностных участков. Для краткости я просто сделаю один Subplot, демонстрирующий разные RCCONT и CCONT Размеры и оставьте читателя для эксперимента с Rstride и Cstride Отказ

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))

counts = [5, 20, 50]

for count, ax in zip(counts, axes.flat):
    # Use same data as the above plots
    ax.plot_surface(X, Y, Z, rcount=count, ccount=count, cmap='copper', lw=0)
    ax.set(title=f'count={count}')
plt.show()

Если вы передаете более низкое значение для Считать Аргументы ключевых слов, есть меньше областей, которые могут быть окрашены. Таким образом, цвета имеют гораздо более различные полосы, когда вы устанавливаете Считать Средства ключевых слов к меньшим значениям. Изменение цвета намного более гладко в участках, которые имеют большие Считать аргументы.

MATPLOTLIB 3D График Colorbar

Добавление COLORBAR на график 3D поверхности такой же, как и добавлять их на другие участки.

Самый простой метод – сохранить вывод ax.plot_surface () в переменной, такой как прибой и пропустите эту переменную к PLT.COLORBAR () Отказ

Вот пример, используя три разных обычаи раньше.

fig, axes = plt.subplots(nrows=1, ncols=3, subplot_kw=dict(projection='3d'),
                         figsize=plt.figaspect(1/3))

cmaps = ['copper', 'coolwarm', 'jet']

for cmap, ax in zip(cmaps, axes):
    # Save surface in a variable: surf
    surf = ax.plot_surface(X, Y, Z, lw=0, cmap=cmap)
    # Plot colorbar on the correct Axes: ax
    fig.colorbar(surf, ax=ax)
    ax.set(title=f'{cmap}')
plt.show()

Важно обеспечить цветную панель для каких-либо цветных графиков, которые вы создаете, особенно если вы используете разные обычаи. Помните, что Colorbar () это Рисунок (не Оси ) Метод, и вы должны использовать топор Ключевой ключевой арт для размещения его на правильном Оси Отказ

Теперь давайте посмотрим, почему Colormaps настолько решают, вращая поверхностные участки и просматривая их от разных углов.

MATPLOTLIB 3D сюжет View_init

Один из способов повернуть свои участки, используя магическую команду % matplotlib ноутбук На вершине ваших ноутбуков Jupyter. Если вы сделаете это, все ваши участки отображаются в интерактивных окнах. Если вместо этого вы используете % matplotlib inline (Настройки по умолчанию), вы должны повернуть свои участки с помощью кода.

Два атрибута, которые управляют вращением 3D-участка: AX.ELEV и AX.azim , которые представляют высоту и азимутальные углы сюжета соответственно.

Высота – угол над SCY-плоскостью и азимут (Не волнуйтесь, я не слышал об этом, прежде чем) – это вращение против часовой стрелки вокруг оси Z. Обратите внимание, что они являются свойствами AXES3D Объект и так вы можете с радостью создавать подпилаты, где каждый имеет другой угол.

Давайте найдем значения по умолчанию.

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

print(f'The default elevation angle is: {ax.elev}')
print(f'The default azimuth angle is: {ax.azim}')
The default elevation angle is: 30
The default azimuth angle is: -60

Вы можете видеть, что значения по умолчанию имеют 30 и -60 градусов для высоты и азимута соответственно.

Вы можете установить их на любой Поплавок, который вы хотите, и есть два способа сделать это:

  1. Переназначить AX.azim и AX.ELEV атрибуты или
  2. Используйте AX.View_init (ELV, AZIM) метод

Вот пример с методом 1.

# Same as usual
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, lw=0, cmap='copper')
# Set axis labels so you know what you are looking at
ax.set(xlabel='x', ylabel='y', zlabel='z')

# Reassign rotation angles to 0
ax.azim, ax.elev = 0, 0
plt.show()

Здесь я устанавливаю оба угла на 0, и вы можете увидеть ось Y спереди, ось x сбоку, а ось Z в качестве вертикали.

Теперь я создам тот же сюжет, используя ax.view_init () Метод, который принимает два поплавка: высота и азимут.

# Same as usual
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, lw=0, cmap='copper')
# Set axis labels so you know what you are looking at
ax.set(xlabel='x', ylabel='y', zlabel='z')

# Reassign rotation angles to 0
ax.view_init(elev=0, azim=0)
plt.show()

Отлично! Этот участок выглядит идентично тому выше, но я использовал ax.view_init () Метод вместо этого. Если вы просто хотите изменить один из углов, пройдите только один из аргументов ключевых слов.

# Same as usual
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, lw=0, cmap='copper')
# Set axis labels so you know what you are looking at
ax.set(xlabel='x', ylabel='y', zlabel='z')

# Set elevation to 90 degrees
ax.view_init(elev=90)
plt.show()

Здесь я установил высоту до 90 градусов, но покинул азимуту со своим значением по умолчанию. Это демонстрирует еще одну причину, почему Colormplaps важно: вы можете сделать вывод форму поверхности от цвета (черный низкий, свет высотой).

Заключение

Вот и все, теперь вы знаете основы создания трехмерных участков в Matplotlib!

Вы узнали необходимый импорт, необходимый, а также как настроить свой Рисунок и Оси объекты должны быть 3D. Вы посмотрели на примеры линейных и разбросных участков. Кроме того, вы можете изменить их, вращая их, добавляя этикетки оси, добавляя легенды и изменяя цвет фона.

Вы узнали, как создать пользовательский 3D-участк наборы данных Использование np.linspace () , np.meshgrid () и Z-функции. Кроме того, вы можете создать их с различной степенью точности, модифицируя Считать и шаг Аргументы ключевых слов.

Вы можете сделать поверхностные участки любого цвета и сортена и изменять их, чтобы цвет линий не захватывает сюжет. Наконец, вы можете повернуть их, установив AX.azim или AX.ELEV атрибуты поплавкам по вашему выбору и даже используют ax.view_init () метод сделать то же самое.

Поздравляем о освоении этих участков! Создание других продвинутых, таких как контур, TRI-поверхность и колчан для вас, будет легким. Вы знаете все навыки высокого уровня; Вам просто нужно выйти туда и практиковать.

Куда пойти отсюда?

Вы хотите, чтобы вы могли быть программистом на полный рабочий день, но не знаете, как начать?

Ознакомьтесь с чистым упаковочным величином, где Chris – Creator of Finxter.com – учит вас стать фрилансером Python в 60 дней или вернуть деньги!

https://tinyurl.com/become-a-python-freelancer

Неважно, если вы начинаете питон или Python Pro. Если вы не делаете шесть фигур/год с Python прямо сейчас, вы узнаете что-то из этого вебинара.

Это доказаны, методы NO-BS, которые получают ваши результаты быстро.

Этот вебинар не будет онлайн навсегда. Нажмите на ссылку ниже, прежде чем сиденья наполнится и научитесь стать фрилансером Python, гарантированно.

https://tinyurl.com/become-a-python-freelancer

Expert Writer & Content Creator – наука о науке и машине. – Я помогаю образовательным компаниям создавать привлечение в блоге и видеоконтентах преподавания данных науки для начинающих. В отличие от моих конкурентов, я узнаю новые концепции каждый день и так понимаю, что это нравится быть студентом. Мои статьи легко понять, эффективны и приятно читать. Мои видео достойны, участвуют и подробно. – Работать со мной, пожалуйста, обратитесь к Upwork https://tinyurl.com/hire-adam-murphy