Разновидности графиков#

Часто используемыми типами графиков в Matplotlib являются:

Далее представлены примеры создания графиков различного типа.

import matplotlib.pyplot as plt
import numpy as np

Линейные и точечные графики#

Предназначены для визуализации функций одного переменного.

# Данные для графика
x = np.linspace(0, 2*np.pi, 11)
y = np.cos(x) * np.exp(-x)
# Строим график
fig, ax = plt.subplots()
ax.plot(x, y);
../_images/50412628ba940fbfb127a77bfd4e434b1d1326e0e4832a1179ab793835b98dbb.png
# То же самое, но с отображением точек
fig, ax = plt.subplots()
ax.plot(x, y, marker="o");
../_images/dcbb7df8647dee8099afe133338edfbfa8f148b6679c817f7371fe1447f61f5a.png
# То же, но без отображения линий (точечный график)
fig, ax = plt.subplots()
ax.plot(x, y, marker="o", ls="");
# "ls" - это linestyle
../_images/5e4c9753dc6dffd29ad6b9742e7eae405b487de346145de1f8a5cc668838ae30.png

Гистограммы#

Предназначены для визуализации распределения значений заданных величин.

# Данные для графика
rg = np.random.default_rng()
x = rg.normal(size=(10_000))
# График
fig, ax = plt.subplots()
ax.hist(x);
../_images/3a544ddc50117d7c561139c4d0f4346d754f8628f6fbd8b78ce6f909d2cd1466.png
# Увеличим число интервалов
fig, ax = plt.subplots()
ax.hist(x, bins=50);
../_images/660b36856c7180be928229b5eb7c7190eaf4695a6c09913e0619b208371610ce.png
# Другое распределение
x = rg.exponential(size=1_000)
fig, ax = plt.subplots()
ax.hist(x, bins=25);
../_images/722c6c34c67a5f1945c9a171c98f1f552b0456507eb1c854584814286836fdf7.png
# Две (и более) гистограммы на одном поле
x1 = rg.normal(size=1000)
x2 = rg.normal(1, 0.25, size=1000)
fig, ax = plt.subplots()
ax.hist(
    [x1, x2],
    bins=25,
    label=["$x_1$", "$x_2$"]
)
ax.legend();
../_images/2aa29c37e703fdb95c8f9b2e8358549ed3a97af896461bb1568e102453f34cc5.png
# То же, но в виде стековой гистограммы
fig, ax = plt.subplots()
ax.hist(
    [x1, x2],
    bins=25,
    stacked=True,
    label=["$x_1$", "$x_2$"]
)
ax.legend();
../_images/0415160329a897645ada73fa5fb93080a9bd060483d0ad5d88d22dbf1c9a3dfd.png
# Гистограмма плотности (распределения)
x = rg.normal(size=1000)
fig, ax = plt.subplots()
ax.hist(x, bins=25, density=True);
../_images/e5d6cb9707a33d2f3b584ea92efce64f2b56e182f163a9a64268e2186c71b0d3.png

Двумерные гистограммы используются для визуализации двумерных распределений.

x = rg.normal(size=5000)
y = rg.normal(size=5000) + x/2
fig, ax = plt.subplots()
img = ax.hist2d(x, y, bins=50)[-1]
fig.colorbar(img, ax=ax);
../_images/51da89ed2a11895e39e3a0f372e69829b299858a4a5d1cf5d666a3899aba67b7.png
# То же, но плотность
fig, ax = plt.subplots()
img = ax.hist2d(x, y, bins=50, density=True)[-1]
fig.colorbar(img, ax=ax);
../_images/7ca6cb556adb87b4d96db9992f6eb834283747ff53512fa8254ed7d3744cbb27.png

Диаграммы разброса#

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

x = rg.normal(size=500)
y = rg.normal(size=500) + x/2
fig, ax = plt.subplots()
ax.scatter(x, y);
../_images/92774b9d000e5ae4cb9c6eb9415eb83700770aaf359417cbd0f7a50a9d0a9abf.png
# То же, но как точечный график plot
fig, ax = plt.subplots()
ax.plot(x, y, ls="", marker="o");
../_images/92774b9d000e5ae4cb9c6eb9415eb83700770aaf359417cbd0f7a50a9d0a9abf.png

Применять plt.plot для анализа данных таким образом эффективнее, чем plt.scatter, поскольку последний заточен под решение задач, связанных с отображением статистических данных. С его помощью можно визуализировать следующую статистику:

engine_power = rg.normal(300, 50, size=1000)
fuel_consuption = engine_power**(1/3) + rg.normal(scale=1.5, size=1000)
# Цвет точки будет связан со стоимостью машины
car_price = fuel_consuption/10 * engine_power/100
fig, ax = plt.subplots()
img = ax.scatter(
    engine_power, fuel_consuption, c=car_price,
    marker="."
)
fig.colorbar(img, ax=ax, label="Стоимость машины")
ax.set(
    xlabel="Мощность двигателя",
    ylabel="Расход топлива"
);
../_images/3814a0f450c83a95a5b4118da9a12e7f4ce286bd424eb7ee916e452e6b803b8b.png
# Заодно отобразим максимальную массу груза
# с помощью размера маркера
max_weight = engine_power
fig, ax = plt.subplots()
img = ax.scatter(
    engine_power, fuel_consuption,
    c=car_price, s=max_weight/20
)
fig.colorbar(img, ax=ax, label="Стоимость машины")
ax.set(
    xlabel="Мощность двигателя",
    ylabel="Расход топлива"
);
../_images/5aede76b2d0147179bf68ae06cdac1e22a20d08a3e83acc7ca01517db3ec28bf.png

Ящик-диаграмма разброса#

Применяется для схожих целей, что и диаграммы разброса и гистограммы.

x1 = rg.normal(10, 3, size=1000)
x2 = rg.normal(6, 1.5, size=2000)
x3 = rg.normal(4, 0.8, size=1700)
fig, ax = plt.subplots()
ax.boxplot([x1, x2, x3])
ax.set(
    xlabel="Вариант системы",
    ylabel="Число отказов"
);
../_images/98c9c6b8b5af654a23f2049c4e4fd0d1ae0fb05ce5be8477a96286dae72baf74.png

Оранжевая линия - это медианное значение. Снизу ящик ограничивает медиана нижней половины данных, а сверху - медиана верхней половины. “Усы” имеют длину в полторы интерквартильной ширины, т.е. в 1.5 раза больше высоты коробки. Точки - это значения, вышедшие за диапазон усов.