matplotlib - andyceo/documentation GitHub Wiki
Для того, чтобы графики показывались в 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
Отображает точки так, как они заданы ("разбрасывает" их по графику). Не соединяет их линиями. Распределенные графики часто используются для визуализации отношений между переменными, обнаружения трендов или совпадений, а также для исследования корреляции.
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). Полезно, если точек много, при их накладывании друг на друга, график будет ярче.
Чертит линии, соединяющие заданные точки в порядке их появления. Линейные графики часто используются для визуализации трендов во времени или зависимости одной переменной от другой. Они могут быть использованы для сравнения нескольких наборов данных, если каждая линия на графике представляет собой один набор данных.
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--")
Данные отображаются в виде вертикальных или горизонтальных полос (столбиков, "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()
Отображает распределение числовых данных в виде вертикальных полос (историограммы). Каждая полоса на гистограмме соответствует диапазону значений переменной и имеет высоту, пропорциональную количеству точек данных, которые попадают в этот диапазон. Гистограммы часто используются для визуализации распределения данных, обнаружения пиков или выбросов, а также для исследования формы распределения.
Гистограммы можно построить с помощью различных параметров, таких как ширина полос (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 - сколько значений ниже или равно текущему)
Представляет собой круговую диаграмму, разделяющуюся на секторы, каждый из которых соответствует категории данных. Размер каждого сектора пропорционален значению переменной, которую он представляет. Круговая диаграмма часто используются для сравнения относительных долей данных в различных категориях или для отображения доли общего числа данных в нескольких категориях.
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
Представляет собой графическое отображение статистических данных, использующее ящик с ползунками. Он состоит из пяти основных элементов:
- Минимальное значение (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)
- Список доступных стилей: https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html
- Создать собственный стиль: https://matplotlib.org/stable/users/explain/customizing.html
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", делает отступы между графиками меньше
Пример ниже начертит график в трехмерном пространстве:
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()