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

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

Все, что вам нужно знать, чтобы сделать продвинутые участки в MatPlotlib: каркасные и поверхностные участки. Смотрите примеры, установите Colormap и Rotation [+ Bonus Video]

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

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

В дополнение к Импорт 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 массивы X , 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)

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

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 массивов и прописных букв X и Y для 2D массивов. Это стандартная практика при изготовлении трехмерных участков, и я использую его по всей статье.

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

# 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) Отказ Поверхностные участки такие же, как каркасные сюжеты, за исключением того, что пробелы между линиями окрашены. Кроме того, есть некоторые дополнительные аргументы ключевых слов, которые вы можете использовать, что может добавить тонну значений на график.

Во-первых, давайте сделаем те же участки, что и выше, с настройками графика поверхности по умолчанию и разные проводить и 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, демонстрирующий разные рассмотрение и CCONT Размеры и оставьте читателя для эксперимента с потрясение и 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 важно: вы можете сделать вывод форму поверхности от цвета (черный низкий, свет высотой).

Заключение

Теперь вы знаете, как создать самые критические 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

Оригинал: “https://blog.finxter.com/matplotlib-3d-plot-advanced/”