Практические руководства, Введение в Matplotlib

Визуализация данных Python с помощью Matplotlib - Часть 2

Завершенные учебные пособия по Matplotlib для построения графиков Python от базового до продвинутого, с более чем 100 примерами

Этот рассказ - следующая часть Визуализации данных Python с помощью Matplotlib - Часть 1. В части 1 мы узнали, как создавать и настраивать точечный график, линейный график, гистограмму и гистограмму. Эта история продолжит изучение Python при построении графиков с помощью Matplotlib, касающееся создания и настройки прямоугольного графика, графика скрипки, круговой диаграммы, полярной диаграммы, географической проекции, трехмерного графика и контурного графика.

Как и в части 1, я говорю вам, что я настроил параметры по умолчанию в Matplotlib. Вот мой стиль рисования

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = 15
plt.rcParams['font.family'] = "serif"
tdir = 'in'
major = 5.0
minor = 3.0
plt.rcParams['xtick.direction'] = tdir
plt.rcParams['ytick.direction'] = tdir
plt.rcParams['xtick.major.size'] = major
plt.rcParams['xtick.minor.size'] = minor
plt.rcParams['ytick.major.size'] = major
plt.rcParams['ytick.minor.size'] = minor

Я использую шрифт LaTeX по умолчанию в гарнитуре с засечками. Если у вас возникла ошибка при активации шрифта LaTeX, вам нужно прочитать эту историю, чтобы найти решение. Я также настраиваю параметры xtick и ytick, меняя направление тактов с out на in и регулируя размер тактов. Вы можете прочитать эту историю, чтобы понять ее. Приступим.

01. Коробчатый сюжет

Вы знаете коробчатый сюжет? Википедия определяет коробчатую диаграмму как метод графического изображения групп числовых данных через их квартили. Используется в описательной статистике. Вы можете увидеть пример коробчатой ​​диаграммы на рисунке 1.

В общем, прямоугольная диаграмма представляет собой картину распределения. Он состоит из коробки, усов и выбросов. На рисунке 1 нет никаких выбросов. В прямоугольном элементе вы можете показать медиану или среднее значение распределения. Мы можем видеть медиану на рисунке 1. Поле ограничено значением Q1 (первый квартиль) и Q3 (третий квартиль). Значение разницы Q1 и Q3 называется межквартильным (IQR). По умолчанию усы показывают границы распределения, минимальное значение и максимальное значение.

На рисунке 2 вы можете увидеть выброс. Как ящичная диаграмма может обнаруживать выбросы? Выброс обнаруживается на ящичковой диаграмме, когда его значение меньше Q1–1,5 x IQR или больше Q3 + 1,5 x IQR.

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

N = 50
np.random.seed(100)
box1 = np.random.randn(N) * 2 + 1

Чтобы показать переменную box1 в виде прямоугольной диаграммы, вы можете использовать этот код

plt.figure()
plt.boxplot(box1)

Вы можете увидеть результат на рисунке 3, когда запустите приведенный выше код.

Горизонтальная коробчатая диаграмма

Если вы хотите изменить ориентацию блочной диаграммы по горизонтали, вам необходимо применить следующий аргумент в коде plt.boxplot ().

vert = False

Вы можете увидеть результат горизонтальной прямоугольной диаграммы на рисунке 4.

В следующем примере я создам распределение с выбросом, изменив начальное число, как показано в следующем коде.

N = 50
np.random.seed(140)
box1 = np.random.randn(N) * 2 + 1
plt.boxplot(box1, vert=False)

Если вы запустите приведенный выше код, вы получите коробчатую диаграмму, как показано на рисунке 5.

Я покажу вам, как Matplotlib обнаруживает выбросы, вычисляя значение Q1–1,5 x IQR, Q3 + 1,5 x IQR и сортируя распределение с помощью этого кода.

q1 = np.quantile(box1, .25)
q3 = np.quantile(box1, .75)
iqr = q3-q1
lower_boundary = q1 - 1.5 * iqr
upper_boundary = q3 + 1.5 * iqr
sort = np.sort(box1)

Чтобы визуализировать нужные мне значения, я запускаю следующий код

Если вы запустите приведенный выше код, он покажет вам цифру, как показано на рисунке 6.

На Рисунке 6 вы можете увидеть сгенерированный мной случайный набор красными точками. Нижняя граница (Q1–1,5 x IQR) равна -3,69, а минимальное значение распределения составляет -2,41. Итак, предел левого уса на рисунке 6 находится в минимальном значении -2,41. Верхняя граница (Q3 + 1,5 x IQR) находится на 5,98, так что данные со значением 7,0 определены как выброс. Правый предел усов закончится в 5,47, на максимальном значении перед верхней границей. Чтобы разместить легенду снаружи рисунка, необходимо прочитать этот рассказ.

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

np.random.seed(1214)
data = [np.random.normal(0, std, 100) for std in range(10, 14)]

Отображение среднего значения

Переменные данные будут генерировать четыре нормальных распределения с mu равным 0 и разными значениями сигмы для каждого распределения (10, 11, 12 и 13). Чтобы показать средние значения на ящичковой диаграмме, вам необходимо использовать этот код

plt.boxplot(data, showmeans=True)

Если вы запустите приведенный выше код, он сгенерирует коробчатую диаграмму, как показано на рисунке 7. Зеленый треугольник представляет среднее значение для каждой прямоугольной диаграммы.

Вы также можете отобразить его на горизонтальной прямоугольной диаграмме, используя этот код

plt.boxplot(data, showmeans=True, vert = False)

Приведенный выше код сгенерирует фигуру, как показано на рисунке 8.

Вы можете изменить символ значения средства, добавив этот аргумент

meanline=True

или скройте форму коробки, используя этот аргумент

showbox=False

Некоторые настройки коробчатой ​​диаграммы показаны на рисунке 8.

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

patch_artist=True

Затем подготовьте свои цвета и примените их к диаграмме коробки, используя этот код

colors = ['royalblue', 'lightblue', 'lightgreen', 'pink']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)

Вот полный код

np.random.seed(123)
all_data = [np.random.normal(0, std, 100) for std in range(10, 14)]
box = plt.boxplot(all_data, notch=False, patch_artist=True)
colors = ['royalblue', 'lightblue', 'lightgreen', 'pink']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)
plt.ylim(-50, 50)

Приведенный выше код сгенерирует фигуру, как показано на рисунке 9.

Активировать выемку

Вы можете отобразить выемку на прямоугольной диаграмме, как показано на рисунке 10, используя этот аргумент.

notch=True

Вы можете воспроизвести рисунок 10 с помощью этого кода.

np.random.seed(123)
all_data = [np.random.normal(0, std, 100) for std in range(10, 14)]
box = plt.boxplot(all_data, notch=True, patch_artist=True)
colors = ['royalblue', 'lightblue', 'lightgreen', 'pink']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)
plt.ylim(-50, 50)

02. Сюжет для скрипки.

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

N = 50
np.random.seed(140)
viol = np.random.randn(N) * 2 + 1
plt.figure()
plt.violinplot(viol)

Код покажет вам сценарий скрипки, как показано на рисунке 11.

Чтобы отобразить его по горизонтали, вы можете использовать тот же аргумент в рамочной диаграмме

vert=False

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

showmeans=True, showmedians=True

Если я объединю приведенные выше аргументы и запущу его, мне будет показан сценарий скрипки, показанный на рисунке 12.

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

violin_parts = plt.violinplot(data, showmedians=True, 
                              showmeans=True)

Я генерирую четыре различных нормальных распределения и определяю их как переменную данные.

Чтобы изменить цвет медианы, среднего, столбцов, минимального и максимального значения, вы можете использовать этот код

vmedian = violin_parts['cmedians']
vmedian.set_edgecolor('r')
vmean = violin_parts['cmeans']
vmean.set_edgecolor('k')
vbars = violin_parts['cbars']
vbars.set_edgecolor('k')
vmax = violin_parts['cmaxes']
vmax.set_edgecolor('darkorange')
vmin = violin_parts['cmins']
vmin.set_edgecolor('darkorange')

Настроенный сценарий скрипки показан на рисунке 13.

Вот полный код для создания рисунка 13.

np.random.seed(1214)
data = [np.random.normal(0, std, 100) for std in range(10, 14)]
plt.figure(figsize = (10, 6))
violin_parts = plt.violinplot(data, showmedians=True, 
                              showmeans=True)
vbars = violin_parts['cbars']
vbars.set_edgecolor('k')
vmedian = violin_parts['cmedians']
vmedian.set_edgecolor('r')
vmean = violin_parts['cmeans']
vmean.set_edgecolor('k')
vmax = violin_parts['cmaxes']
vmax.set_edgecolor('darkorange')
vmin = violin_parts['cmins']
vmin.set_edgecolor('darkorange')

Чтобы изменить цвет тел (контура), вам нужно использовать этот код

for vp in violin_parts['bodies']:
    vp.set_facecolor('orange')
    vp.set_edgecolor('k')
    vp.set_linewidth(3)

Приведенный выше код изменит цвет тела на оранжевый с черным в качестве цвета края и отрегулирует ширину линии до 3, как показано на рисунке 14.

На рисунке 14 я просто показываю медианные значения для каждого распределения. Вы можете воспроизвести рисунок 14 с помощью следующего кода

np.random.seed(1214)
data = [np.random.normal(0, std, 100) for std in range(10, 14)]
plt.figure(figsize = (10, 6))
violin_parts = plt.violinplot(data, widths=0.9, showmedians=True)
for vp in violin_parts['bodies']:
    vp.set_facecolor('orange')
    vp.set_edgecolor('k')
    vp.set_linewidth(3)

Я создаю полную настройку своих скрипичных сюжетов, как показано на рисунке 15.

Вы можете сгенерировать рисунок 15, используя этот код

np.random.seed(1214)
data = [np.random.normal(0, std, 100) for std in range(10, 14)]
# Create violin plot objects:
plt.figure(figsize=(10, 6))
violin_parts=plt.violinplot(data, showmedians=True, showmeans=True)
# Make the violin body blue with a red border:
for vp in violin_parts['bodies']:
    vp.set_facecolor('royalblue')
    vp.set_edgecolor('k')
    vp.set_linewidth(2)
    vp.set_alpha(.8)
colors = ['k', 'red', 'red', 'w', 'k']
part = ['cbars','cmins','cmaxes','cmeans','cmedians']
for i in range(len(part)):
    vp = violin_parts[part[i]]
    vp.set_edgecolor(colors[i])
    vp.set_linewidth(2)

03. Круговая диаграмма

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

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
numbers = [15, 30, 45, 10]

Чтобы визуализировать это в виде круговой диаграммы, вы можете использовать этот код

plt.pie(numbers)

Приведенный выше код сгенерирует круговую диаграмму, как показано на рисунке 16.

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

labels = labels

Если вы хотите показать количество каждого животного, вам нужно вставить этот аргумент

autopct='%1.1f%%'

Вы можете увидеть результат своей круговой диаграммы после добавления меток и чисел на рисунке 17.

Вот полный код для создания рисунка 17.

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
plt.figure()
plt.pie(sizes, labels = labels, autopct='%1.1f%%')

Вы можете изменить начальный угол круговой диаграммы, используя этот аргумент

startangle=90

Начальный угол по умолчанию равен 0, применяется для первых данных (лягушки). Я настраиваю начальный угол под двумя разными углами, как показано на рисунке 18.

Вот код для создания рисунка 18.

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode1 = (0, 0.1, 0, 0)
explode2 = (0, 0, 0.1, 0)
plt.figure(figsize=(10, 10))
plt.subplot(121)
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('Startangle = 90$^\circ$')
plt.subplot(122)
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=180)
plt.title('Startangle = 180$^\circ$')

Вы также можете сделать запас для конкретной круговой диаграммы, как показано на рисунке 19.

Вы можете воспроизвести рисунок 19, используя следующий код

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode1 = (0, 0.1, 0, 0)
explode2 = (0, 0, 0.1, 0)
plt.figure(figsize=(10, 10))
plt.subplot(121)
plt.pie(sizes, explode=explode1, labels=labels, 
        autopct='%1.1f%%', startangle=90)
plt.subplot(122)
plt.pie(sizes, explode=explode2, labels=labels, 
        autopct='%1.1f%%', startangle=180)

Вы можете изменить поле, изменив значение в переменной разнесения.

Применение разных стилей к круговой диаграмме

Вы хотите визуализировать данные в виде круговой диаграммы в другом стиле? Yups, вы можете увидеть рисунок 20.

Отличие от предыдущей круговой диаграммы в том, что я помещаю метки в легенду. Для этого вам нужно использовать этот аргумент

textprops={'color':"w"}

и этот код

plt.legend(labels, bbox_to_anchor = (1., .95),  title="Labels Name")

Вы можете воспроизвести рисунок 20, используя следующий код

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
plt.figure(figsize=(7, 7))
plt.pie(sizes, autopct='%1.1f%%', textprops={'color':"w"}, 
        explode = explode, startangle = 90)

Тень на круговой диаграмме

Вы можете добавить тень на круговую диаграмму, используя этот аргумент

shadow=True

Результат показан на рисунке 21.

Думаю, я знаю, о чем вы думаете: D. Тень уродливая, правда? Я перепробовал множество альтернатив; вот они

а. Если вы используете Jupyter, вы можете сохранить круговую диаграмму вручную, щелкнув фигуру правой кнопкой мыши. Затем нажмите «Сохранить изображение как», как показано на рисунке 22.

Сохраненное изображение показано на рисунке 23.

б. Другой альтернативой является добавление белой обводки в качестве переднего плана. Чтобы применить его, вам нужно импортировать path_effects из Matplotlib, используя этот код

import matplotlib.patheffects as path_effects

Затем определите имя переменной для своей круговой диаграммы, как показано в следующем коде.

patches, texts, autotexts = plt.pie(sizes, autopct='%1.1f%%', 
                                    textprops={'color':"w"}, 
                                    explode = explode, 
                                    startangle = 90, shadow=True)

Затем настройте path_effects с помощью этого кода

for patch in patches:
    patch.set_path_effects([path_effects.Stroke(linewidth=2.5, 
                                                foreground = 'w')])

Вот полный код

Если вы запустите приведенный выше код, он создаст круговую диаграмму, как показано на рисунке 24.

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

Кольцевая диаграмма

Используя функции круговой диаграммы в Matplotlib, вы можете создать кольцевую диаграмму, как показано на рисунке 26.

Вот код для генерации данных для рисунка 26.

size = 0.3
vals = np.array([[60.], [37.], [29.]])
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))

Кольцевая диаграмма похожа на круговую диаграмму, но без полного радиуса от центра. На рисунке 26 я установил радиус равным 0,3. Вот код для создания рисунка 26.

plt.figure(figsize=(10,10))
plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

Я также создаю два разных размера радиуса, как показано на рисунке 27.

Вы можете воспроизвести рисунок 27 с помощью следующего кода.

vals = np.array([[60.], [37.], [29.]])
plt.figure(figsize=(10,10))
plt.subplot(121)
plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=.3, edgecolor='w'))
plt.title('Size = 0.3')
plt.subplot(122)
plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=.5, edgecolor='w'))
plt.title('Size = 0.5')

Вы также можете создать двойную кольцевую диаграмму, как показано на рисунке 28.

Вот код для создания рисунка 28.

plt.figure(figsize=(10, 10))
size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))
plt.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

Если вы прочитаете документацию по кольцевой диаграмме на сайте Matplotlib, вы встретите красивую кольцевую диаграмму, как показано на рисунке 29.

Вы можете создать рисунок 29, используя этот код.

04. Полярная карта.

В плоской проекции у вас будет ось x и ось y. В полярной проекции вам необходимо определить его в форме радиуса и угла, как показано на рисунке 30.

В полярной проекции ось радиуса отображается в размере радиуса круга, а угол проецируется, поскольку угол каждого круга с 0 градусом является начальной точкой. Чтобы сгенерировать полярную проекцию, вам необходимо определить тип проекции как полярную, как показано в следующем аргументе.

projection='polar'

Вот полный код для создания рисунка 30.

r = np.linspace(0, 2, 100)
theta = 2 * np.pi * r
fig = plt.figure(figsize=(13, 4))
ax1 = plt.subplot(121, projection='polar')
ax1.scatter(theta, r, label = 'Polar Projection', s = 10)
ax1.legend(bbox_to_anchor = (.85, 1.35))
ax2 = plt.subplot(122)
ax2.scatter(theta, r, label = 'Planar Projection', s = 10)
ax2.legend(bbox_to_anchor = (0.85, 1.35))
ax2.set_xlabel('R')
ax2.set_ylabel(r'$\theta$')

Вы также можете представить свои данные в стилях линий графика в полярной проекции, как показано на рисунке 31.

Вы можете воспроизвести рисунок 31 с помощью этого кода.

Далее создается столбчатая диаграмма в полярной проекции, как показано на рисунке 32.

Когда вы видите рисунок 32, возможно, вы помните логотип Matplotlib: D Чтобы создать рисунок 32, вам необходимо сгенерировать данные, используя этот код.

np.random.seed(10130)
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.random.rand(N) * .8 - .1
colors = plt.cm.Spectral(radii / 10)

Чтобы визуализировать это, вы можете использовать следующий код

plt.figure(figsize=(7, 7))
ax = plt.subplot(111, projection='polar')
ax.bar(theta, radii, width=width, bottom=0.0, 
       color=colors, alpha=0.5)

Если вы хотите создать логотип Matplotlib с использованием полярной гистограммы, вы можете прочитать эту документацию.



05. Географическая проекция

Чтобы визуализировать ваши географические данные, вы можете использовать географическую проекцию, предоставленную Matplotlib. Существует четыре типа проекций: проекция Айтоффа, Хаммера, Моллвейде и проекция Ламберта. Чтобы понять это, я создам фиктивные данные с помощью этого кода.

N = 100
np.random.seed(157)
long = np.random.random(N) * 360 - 180
lat = np.random.random(N) * 180 - 90

Чтобы визуализировать это в проекции Айтоффа, вы можете использовать этот код

plt.figure(figsize=(12, 7))
plt.subplot(111, projection="aitoff")
plt.scatter(long, lat, marker = '*', color = 'red', s = 40)
plt.title("Aitoff")
plt.grid(True)

Код покажет вам цифру, как показано на рисунке 33.

В проекции Aitoff вам необходимо убедиться, что ваши данные указаны в градусах.

Далее идет проекция Хаммера. Вы можете представить свои данные в проекции Hammer с помощью этого кода

plt.figure(figsize=(12, 7))
plt.subplot(111, projection="hammer")
plt.scatter(long, lat, marker = '*', color = 'red', s = 40)
plt.title("Hammer")
plt.grid(True)

В проекции Hammer единицами измерения долгой и широты являются градусы. Приведенный выше код сгенерирует фигуру, как показано на рисунке 34.

Я не уверен, в чем разница между проекцией Aitoff и Hammer. Если вам нужно какое-то объяснение, вы можете прочитать эти ссылки.





В проекции Моллвейде единицы данных необходимо преобразовать в радианы. Вот код для генерации данных в радианах.

N = 100
np.random.seed(157)
long = np.random.random(N) * 2 * np.pi  - np.pi
lat = np.random.random(N) * np.pi - (np.pi / 2)

Чтобы визуализировать это в проекции Mollweide, вы можете использовать этот код

plt.figure(figsize=(12, 7))
plt.subplot(111, projection="mollweide")
plt.scatter(long, lat, marker = '*', color = 'red', s = 40)
plt.title("Mollweide")
plt.grid(True)

Если вы запустите приведенный выше код, он создаст фигуру, как показано на рисунке 35.

Последняя проекция - это проекция Ламберта, как показано на рисунке 36.

Единица измерения данных - радианы. Вы можете воспроизвести рисунок 36, используя этот код.

N = 100
np.random.seed(157)
long = np.random.random(N) * 2 * np.pi  - np.pi
lat = np.random.random(N) * np.pi - (np.pi / 2)
plt.figure(figsize=(12, 12))
plt.subplot(111, projection="lambert")
plt.scatter(long, lat, marker = '*', color = 'red', s = 40)
plt.title("Lambert")
plt.grid(True)

06. 3D сюжет

Чтобы создать трехмерный график, вам необходимо определить тип проекции как 3d, как показано в следующем аргументе.

projection = '3d'

Трехмерная проекция даст вам результат, показанный на рисунке 37.

Я генерирую фиктивные данные с помощью этого кода.

N = 250
np.random.seed(124)
x = 15 * np.random.random(N)
y = np.sin(x) + 0.25 * np.random.random(N)
z = np.cos(x) + 0.25 * np.random.random(N)

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

plt.figure(figsize=(9, 6))
ax = plt.axes(projection = '3d')
ax.scatter3D(x, y, z, color = 'r')
ax.set_xlabel('x', fontsize = 20, labelpad = 20)
ax.set_ylabel('y', fontsize = 20, labelpad = 20)
ax.set_zlabel('z', fontsize = 20, labelpad = 20)

Код сгенерирует трехмерный график, как показано на рисунке 38.

Насколько я знаю, в новейшей версии Matplotlib аспект всегда одинаков для каждой оси. Чтобы изменить это, вы можете использовать этот код

ax.set_box_aspect((2., 1.5, 1.2))

Я изменяю соотношение сторон для осей x, y и z на 2: 1,5: 1,2. После применения приведенного выше кода у вас будет график, как показано на рисунке 39.

3D сюжетная линия

Вы можете создать трехмерную сюжетную линию, как показано на рисунке 40.

Вы можете воспроизвести рисунок 40 с помощью этого кода.

N = 100
np.random.seed(124)
xline = np.linspace(0, 15, N)
yline = np.sin(xline) 
zline = np.cos(xline)
fig = plt.figure(figsize=(9, 6))
ax = plt.axes(projection = '3d')
ax.plot3D(xline, yline, zline)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_box_aspect((2, 1.5, 1.2))

Вы можете изменить угол обзора с помощью этого кода

ax.view_init(10, 180)

Первый аргумент в view_init - это угол возвышения, а второй - для азимутального угла. Вы можете увидеть разные представления для разных углов, как показано на рисунке 41.

Треугольные 3D-поверхности

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

ax.plot_trisurf()

Я генерирую данные для визуализации на треугольных трехмерных поверхностях с помощью этого кода.

N = 2000
np.random.seed(124)
r = 2 * np.pi * np.random.random(N)
theta = 20 * np.pi * np.random.random(N)
xdata = np.ravel(r * np.sin(theta))
ydata = np.ravel(r * np.cos(theta))
zdata = np.sin(xdata) + np.cos(ydata)

Вы можете увидеть график треугольных трехмерных поверхностей из данных выше на рисунке 42.

Вы можете воспроизвести рисунок 42 с помощью этого кода.

3D контурный график

Matplotlib предоставляет трехмерный контурный график. Вы можете создать его с помощью этого кода

ax.contour3D()

Я генерирую фиктивные данные, используя следующий код

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)

Чтобы визуализировать это, я запускаю этот код

fig = plt.figure(figsize=(9, 6))
ax = plt.axes(projection = '3d')
ax.contour3D(X, Y, Z, cmap = 'Spectral')

После настройки мой трехмерный контурный график показан на рисунке 43.

Вы можете воспроизвести рисунок 43, используя этот код.

По умолчанию Matplotlib создает трехмерный контурный график с контуром из 7 отсчетов. Вы можете изменить его, записав нужное количество в четвертый аргумент ax.contour3D (), как показано в приведенном ниже коде.

ax.contour3D(X, Y, Z, 256, cmap = 'Spectral')

Вы можете увидеть различные трехмерные контурные графики на рисунке 44.

Вот полный код для создания рисунка 44.

Чтобы показать цветовую полосу, вы можете использовать этот код

plt.colorbar()

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

Вы можете использовать тот же код, что и на предыдущих графиках, чтобы изменить угол обзора, как показано на рисунке 45.

Ошибки в 3D-контуре Matplotlib

Я думаю, что есть ошибка в 3D-контуре Matplotlib, как показано на рисунке 46.

Чтобы создать рисунок 46, вы измените значение угла возвышения и азимута в предыдущем коде (код для создания рисунка 45). Вы поняли, что я имел в виду под ошибками? Если вы внимательно проанализируете рисунок 46, вы увидите странную особенность. Вы можете увидеть это на рисунке 47.

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

Чтобы понять это более подробно, я представлю два разных представления контура в Matplotlib, ax.contour () и ax.contourf (), как показано на рисунке 48.

contourf в ax.contourf означает заполненный контур. Итак, вы можете увидеть разницу между ax.contour () и ax.contourf () на рисунке 48. ax.contour имеет аналогичные значения контура по умолчанию с ax.contour3D (), 7 отсчетов. Но у ax.contourf () другое количество счетчиков, оно равно 8. Вы можете воспроизвести рисунок 48 с помощью этого кода.

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
plt.figure(figsize=(14, 6))
ax1 = plt.subplot(121, projection = '3d')
ax1.contour(X, Y, Z, cmap = 'Spectral')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('z')
ax1.set_box_aspect((3, 3, 1))
ax1.view_init(10, 100)
ax1.set_title('Contour Default, elevation = 10, azimuth = 100')
ax2 = plt.subplot(122, projection = '3d')
ax2.contourf(X, Y, Z, cmap = 'Spectral')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_zlabel('z')
ax2.set_box_aspect((3, 3, 1))
ax2.view_init(10, 100)
ax2.set_title('Contourf Default, elevation = 10, azimuth = 100')

Вы можете внимательно наблюдать на правой панели Рисунок 48 (контурный график). Упомянутых мною ошибок в 3D контуре не обнаружено. Вы можете увидеть это более подробно на рисунке 49.

Вы можете видеть, что if ax.contour () выдаст ту же ошибку, но не для ax.contourf (). Итак, я рекомендую вам использовать ax.contourf (), если вы хотите визуализировать контурный график в трехмерной проекции.

Каркасный сюжет

Вы можете создать каркасный график в Matplotlib, используя этот код

ax.plot_wireframe()

Вот код для генерации фиктивных данных для визуализации в каркасном графике.

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)

Каркасный график по умолчанию, как показано на рисунке 50.

Вы можете воспроизвести рисунок 50 с помощью следующего кода

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
fig = plt.figure(figsize=(10, 10))
ax = plt.axes(projection = '3d')
ax.plot_wireframe(X, Y, Z, color = 'k', alpha = .2)

Настроенный каркасный график показан на рисунке 51.

Я изменяю количество слоев каркаса на 5, устанавливаю угол возвышения на 60 градусов и азимутальный угол на 100 градусов. Вы можете использовать этот код для создания рисунка 51.

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
fig = plt.figure(figsize=(9, 6))
ax = plt.axes(projection = '3d')# 3d contour plot
ax.plot_wireframe(X, Y, Z, 5, color = 'k', alpha = .2)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_box_aspect((2, 2, 1))
ax.view_init(60, 100)
ax.set_title('Wireframe counts = 5, elevation = 60, azimuth = 100')

Если вы хотите проверить, встречаются ли похожие ошибки в ax.contour () и ax.contour3D () или нет, вы можете изменить угол возвышения на 10 градусов, а азимутальный угол на 100 градусов, как показано на рисунке 52.

Мы не встречаем ошибок в каркасном сюжете.

3D-график поверхности

С помощью этого кода вы можете создать трехмерный график поверхности в Matplotlib.

ax.plot_surface()

Настроенный трехмерный график поверхности показан на рисунке 53.

Вы можете воспроизвести рисунок 53 с помощью этого кода.

N = 100
np.random.seed(3124)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
fig = plt.figure(figsize=(8, 8))
ax = plt.axes(projection = '3d')# 3d contour plot
ax.plot_surface(X, Y, Z, )
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_box_aspect((2, 2, 1))
ax.view_init(10, 100)
ax.set_title('Plot surface Default, elevation = 10, azimuth = 100')

Вы можете значения для cstride и rstride, используя этот аргумент

rstride = 1, cstride = 1

Вы можете увидеть разницу между значением cstride по умолчанию и значением rstride по сравнению с настроенным на рисунке 54.

Чтобы сгенерировать рисунок 54, вы можете использовать этот код

Вы не встретите ошибок, которые встречаются на контурном графике, как показано на рисунке 55.

Создание мяча в Matplotlib

Вы можете создать шар в Matplotlib, как показано на рисунке 56.

Вы можете создать рисунок 56 с помощью следующего кода

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
plt.figure(figsize=(10, 10))
ax = plt.subplot(projection = '3d')
ax.plot_surface(x, y, z, cmap = 'inferno')

Вы можете настроить для него угол обзора, как показано на рисунке 57.

Вы можете воспроизвести рисунок 57, используя этот код.

07. 2D контурный график

Последний тип графика, который я вам покажу, - это контурный 2D-график. Вы можете создать 2D контурный график, используя этот код

plt.contour()

Хотя название - 2D контурный график, но он показывает данные 3D. Я создаю фиктивные данные с помощью этого кода

N = 100
np.random.seed(100)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)

Я представляю фиктивные данные в виде контурного графика, как показано на рисунке 58.

Вы можете воспроизвести рисунок 58 с помощью следующего кода

N = 100
np.random.seed(100)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
plt.figure(figsize=(7, 5))
plt.contour(X, Y, Z)
plt.title('Contour 2D Default', pad = 10)

Я создаю два настраиваемых контурных графика, как показано на рисунке 59.

Чтобы создать рисунок 59, вы можете использовать этот код

N = 100
np.random.seed(100)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contour(X, Y, Z, 256)
plt.title('Contour 2D counts = 256, cmap = viridis', pad = 10)
plt.colorbar()
plt.subplot(122)
plt.contour(X, Y, Z, 256, cmap = 'Spectral')
plt.colorbar()
plt.title('Contour 2D counts = 256, cmap = Spectral', pad = 10)

Кроме того, вы можете создать контур с заливкой в ​​2D-проекцию, как показано на рисунке 60.

Вы можете сгенерировать рисунок 60 с помощью следующего кода

N = 100
np.random.seed(100)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)**3
plt.figure(figsize=(7, 5))
plt.contourf(X, Y, Z, cmap = 'Spectral')
plt.colorbar()
plt.title('Contourf 2D Default', pad = 10)

Здесь я создаю два разных контурных графика, как показано на рисунке 61.

Вы можете сгенерировать рисунок 61, используя этот код

N = 100
np.random.seed(100)
x = np.linspace(-2, 2, N) + np.random.random(N)
y = np.linspace(-2, 2, N) + np.random.random(N)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)**3
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contourf(X, Y, Z, 50, cmap = 'inferno')
plt.colorbar()
plt.title('Contourf 2D counts = 50', pad = 10)
plt.subplot(122)
plt.contourf(X, Y, Z, 200, cmap = 'inferno')
plt.colorbar()
plt.title('Contourf 2D counts = 200', pad = 10)

Заключение

Визуализация данных имеет важное значение при анализе данных из небольших данных или больших данных в технологическую эпоху. Нам это нужно, чтобы иметь глобальную картину наших данных. С Matplotlib можно использовать различные типы визуализации. Это лишь небольшая часть построения графика Python с помощью Matplotlib. В этой серии руководств Matplotlib (часть 1 и часть 2) я создал 101 рисунок. Если вы прочитали всю часть, вам нужно потратить свои 48 минут: D Я надеюсь, что эта история поможет вам визуализировать ваши данные в виде различных типов графиков.

Если вам понравилась эта статья, вот еще несколько статей, которые могут вам понравиться:











Это все. Спасибо, что прочитали эту историю. Комментируйте и делитесь, если вам это нравится. Я также рекомендую вам подписаться на мою учетную запись, чтобы получать уведомление, когда я публикую свою новую историю.