matplotlib - andyceo/documentation GitHub Wiki

from scipy.special import labelmatplotlib

Интеграция в различные среды (PyCharm, Jupiter)

Для того, чтобы графики показывались в Python-консоли Pycharm, нужно прописать следующее:

import matplotlib
matplotlib.use('TkAgg')

После этого можно вызвать любую функцию построения графиков и он отобразится сразу же (делать plt.show() не нужно):

import numpy as np
import matplotlib.pyplot as plt
plt.scatter(*(np.random.rand(2,100)))

Основные понятия

  • Figure (Рисунок): то, где отображается график (окно, виджет Jupyter и т.п.). Может содержать несколько Axes (Оси) и других элементов, и он отвечает за их организацию и управление ими. Figure (Рисунок) - это основной контейнер, который содержит все элементы отображения, такие как Оси (Axes), легенды, цветовые шкалы (colorbars) и другие элементы, называемые Художниками (Artists).

  • Axes (Оси): область, в которой точки графика могут быть указаны в терминах x-y координат (или theta-r в графике полярных координат, x-y-z в 3D графике и т.д.). Оси (Axes) - это Художник (Artist), прикрепленный к Рисунку (Figure), который содержит область для отображения данных и обычно включает два (или три в случае 3D) объекта Осей (Axis) (обратите внимание на отличие между Осями (Axes) и Осью (Axis), также, в английском языке axes это множественная форма от axis). Ось обеспечивает шкалу данных и отвечает за отметки, метки и масштаб шкалы. Каждый объект Оси (Axes) также имеет заголовок (устанавливается с помощью set_title()), метку x (устанавливается с помощью set_xlabel()) и метку y, установленную с помощью set_ylabel(). Методы Оси являются основным интерфейсом для настройки большинства частей вашего графика (добавление данных, управление шкалами и пределами оси, добавление меток и т.д.)

  • Axis (Ось): Эти объекты устанавливают шкалу и пределы, а также генерируют отметки и текстовые подписи отметок. Расположение отметок определяется объектом Locator, а подписи отметок форматируются с помощью объекта Formatter. Комбинация правильного Locator и Formatter обеспечивает очень тонкий контроль над расположением и подписями отметок.

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

  • Formatter: это объект, ответственный за форматирование подписи отметки в соответствии с выбранной шкалой или другими параметрами. Он используется для управления форматом отображаемых чисел на осях графика.

  • Artist (Художник): все видимые элементы на Рисунке являются Художниками (Artists) (даже сами объекты Рисунок (Figure), Оси (Axes) и Ось (Axis)). Это включает в себя объекты Text, Line2D, коллекции объектов, Патч-объекты и т.д. Когда Рисунок отображается, все Художники рисуются на холсте. Большинство Художников привязаны к Осям (Axes); такой Художник не может быть разделен между несколькими Осями (Axes) или перемещен с одной на другую.

Самый простой способ создать Рисунок (Figure) с Осями (Axes) - это использовать pyplot.subplots. Затем мы можем использовать Axes.plot для рисования некоторых данных на Осях и show для отображения рисунка:

import matplotlib.pyplot as plt      # Usual convention for using matplotlib
fig, ax = plt.subplots()             # Create a figure containing a single Axes.
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the Axes.
plt.show()

Основная страница документации с главными концепциями: https://matplotlib.org/stable/users/explain/quick_start.html

Основные графики

Scatter plot (распределенный график)

Отображает точки так, как они заданы ("разбрасывает" их по графику). Не соединяет их линиями. Распределенные графики часто используются для визуализации отношений между переменными, обнаружения трендов или совпадений, а также для исследования корреляции.

import numpy as np
import matplotlib.pyplot as plt

n_points = 50  # 1000 to demonstrate alpha
max_coord_value = 100
X_data = np.random.random(n_points) * max_coord_value
y_data = np.random.random(n_points) * max_coord_value

plt.scatter(X_data, y_data)
plt.show()

# Some styling
plt.scatter(X_data, y_data, c="#00f", marker="*", s=150, alpha=0.3)
plt.show()

Параметры plt.scatter():

  • s: размер точки (int)
  • c: цвет точки. Пример: "r" (red color), "red", "green", "#000000" (hex color), "#0f0" (hex color short form for "green")
  • marker: символ, которым отображается точка. Пример: "*"
  • alpha: прозрачность (0..1). Полезно, если точек много, при их накладывании друг на друга, график будет ярче.

Line plot (линейный график)

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

import matplotlib.pyplot as plt

years = [2006 + x for x in range(16)]
weights = [80, 83, 84, 85, 86, 82, 81, 79, 83, 80, 82, 82, 83, 81, 80, 79]

plt.plot(years, weights, c="g", lw=3, linestyle="--")
plt.show()

Параметры plt.plot():

  • c: цвет. аналогично plt.scatter()
  • lw: ширина линии (int)
  • linestyle: стиль линии. Пример: "--"

c и linestyle можно передать третьим параметром вместо позиционных переменных: plt.plot(years, weights, "r--")

Bar plot (столбчатый график)

Данные отображаются в виде вертикальных или горизонтальных полос (столбиков, "bars"), длина которых пропорциональна значению переменной, которую они представляют. Каждая полоса на графике представляет собой одно значение переменной и может быть отмечена цветом или штриховкой для обозначения различных категорий данных. Столбчатые графики часто используются для сравнения нескольких наборов данных или показателей в одной категории, а также для визуализации распределения данных по категориям.

import matplotlib.pyplot as plt

x = ["C++", "C#", "Python", "Java", "Go"]
y = [20, 50, 140, 1, 45]

plt.bar(x, y, color="r", align="edge", width=0.5, edgecolor="green", lw=6)
plt.show()

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

Параметры plt.bar():

  • color: цвет. Задается аналогично plt.scatter(), но нельзя задать короткую форму c.
  • align: откуда начинать столбец. Пример: "edge" - начнет столбец от метки на оси x (а не посередине метки)
  • width: ширина столбца. Пример: 0.5
  • edgecolor: цвет границы столбца. Задается так же как и обычный параметр цвета color
  • lw: ширина границы. Задается аналогично plt.plot()

Histogram (гистограмма)

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

Гистограммы можно построить с помощью различных параметров, таких как ширина полос (bin width) и число полос (number of bins). Изменение этих параметров может повлиять на форму гистограммы и информацию, которую она предоставляет.

import numpy as np
import matplotlib.pyplot as plt

mean = 20
std = 1.5
n = 1000
ages = np.random.normal(mean, std, n)

plt.hist(ages, bins=[ages.min(), 18, 21, ages.max()])

Параметры plt.hist():

  • bins: на сколько групп делить данные при отображении гистограммы. Пример: 20 (число групп), или [] - список групп
  • cumulative: накопленная гистограмма (по оси y - сколько значений ниже или равно текущему)

Pie chart (круговая диаграмма)

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

import matplotlib.pyplot as plt

langs = ["Python", "C++", "Java", "C#", "Go"]
votes = [50, 24, 14, 6, 17]
explodes = [0, 0, 0, 0.2, 0]

plt.pie(votes, labels=langs, explode=explodes, autopct="%.2f%%", pctdistance=0.8, startangle=90)

Параметры plt.pie():

  • labels: список меток, которыми подписывать диаграмму
  • explode: массив floats, указывающий, какие элементы должны быть выделены из диаграммы и насколько далеко
  • autopct: печатать процент и его форматирование, который занимает тот или иной кусок диаграммы. Пример: "%.2f%%"
  • pctdistance: положение строки с процентом, float. Чем больше - тем дальше от центра диаграммы. Пример: 0.8
  • startangle: угол в градусах, откуда начинать построение диаграммы. Она строится против часовой стрелки. Пример: 90

Box plot (круговая диаграмма)

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

  • Минимальное значение (minimum)
  • Первый квартиль (Q1) или нижняя граница верхней части бокса
  • Медиана (медианное значение), которая представляет собой центральную точку в данных и отображается как полоса внутри ящика
  • Третий квартиль (Q3) или верхняя граница нижней части бокса
  • Максимальное значение (maximum)

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

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

import numpy as np
import matplotlib.pyplot as plt

mean = 172
std = 8
n = 300
heights = np.random.normal(mean, std, n)

plt.boxplot(heights)

Настройка графика

Задаем название, подписи к осям, подписи к отметкам на y-оси.

import matplotlib.pyplot as plt

years = [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021]
income = [55, 56, 62, 61, 72, 72, 73, 75]

income_ticks = list(range(50, 81, 2))

plt.plot(years, income)
plt.title("Income if John (in USD)", fontsize=30, fontname="FreeSerif")
plt.xlabel("Year")
plt.xlabel("Yearly Income in USD")
plt.yticks(income_ticks, [f"${x}k" for x in income_ticks])

plt.show()

Легенда и несколько графиков на одном рисунке

import matplotlib.pyplot as plt

stock_a = [100, 102, 99, 101, 101, 100, 102]
stock_b = [90, 95, 102, 104, 105, 103, 109]
stock_c = [110, 115, 100, 105, 100, 98, 95]

plt.plot(stock_a, label="Company1")
plt.plot(stock_b, label="Company2")
plt.plot(stock_c, label="Company3")

plt.legend(loc="lower center")

Для кругового графика можно изменить подписи:

import matplotlib.pyplot as plt

votes = [10, 2, 5, 16, 22]
people = ["A", "B", "C", "D", "E"]

plt.pie(votes, labels=None)
plt.legend(labels=people)

Стили

import matplotlib.pyplot as plt
plt.style.use('ggplot')

Несколько графиков

Пример ниже покажет сразу два окна с разными графиками после plt.show():

import numpy as np
import matplotlib.pyplot as plt

x1, y1 = np.random.random(100), np.random.random(100)
x2, y2 = np.arange(100), np.random.random(100)

plt.figure(1)
plt.scatter(x1, y1)

plt.figure(2)
plt.plot(x2, y2)

plt.show()

А пример ниже покажет два разных графика в одном окне:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)

fig, axs = plt.subplots(2, 2)  # Four sublots with coords: 0,0; 0,1; 1,0; 1,1

axs[0, 0].plot(x, np.sin(x))
axs[0, 0].set_title("Sine Wave")

axs[0, 1].plot(x, np.cos(x))
axs[0, 1].set_title("Cosine Wave")

axs[1, 0].plot(x, np.random.random(100))
axs[1, 0].set_title("Random Function")

axs[1, 1].plot(x, np.log(x))
axs[1, 1].set_title("Log Function")
axs[1, 1].set_xlabel("TEST")

fig.suptitle("Four Plots")  # super title over all plots

plt.tight_layout()  # структурирует все так, чтобы надписи не пересекались

plt.savefig("fourplots.png", dpi=300, transparent=False, bbox_inches="tight")  # сохраняет график в картинку
plt.show()

Параметры plt.savefig():

  • dpi: качество
  • transparent: если True, прозрачный фон (а не белый)
  • bbox_inches: если "tight", делает отступы между графиками меньше

3D-plots (трехмерные графики)

Пример ниже начертит график в трехмерном пространстве:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.axes(projection="3d")  # указываем, что оси - трехмерные (по умолчанию - двумерные)

x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)

ax.scatter(x, y, z)
ax.set_title("3D Plot")
ax.set_xlabel("test")
plt.show()

Пример ниже начертит поверхность:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.axes(projection="3d")  # указываем, что оси - трехмерные (по умолчанию - двумерные)

x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)

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

Z = np.sin(X) * np.cos(Y)

ax.plot_surface(X, Y, Z, cmap="Spectral")
ax.set_title("3D Plot")
ax.set_xlabel("test")
ax.view_init(azim=0, elev=90)
plt.show()

Анимация

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

import matplotlib.pyplot as plt
import random

heads_tails = [0, 0]  # статистика подбросов монетки, 0 элемент - heads, 1 - tails

for _ in range(10000):
    heads_tails[random.randint(0, 1)] += 1
    plt.bar(["Heads", "Tails"], heads_tails, color=["red", "blue"])
    plt.pause(0.0001)  # та самая функция что делает анимацию

plt.show()

Ссылки

⚠️ **GitHub.com Fallback** ⚠️