Как установить диапазон оси (xlim, ylim) в Matplotlib
Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. Большая часть популярности Matplotlib связана с его параметрами настройки — вы можете настроить практически любой элемент из его иерархии объектов.
В этом руководстве мы рассмотрим, как установить диапазон оси (xlim, ylim) в Matplotlib, чтобы обрезать или расширить представление до определенных пределов.
Создание сюжета
Сначала создадим простой сюжет:
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.show()
Здесь мы построили две синусоидальные функции, начиная с 0 и заканчивая 100 с шагом 0.1 . Запуск этого кода дает:
Теперь мы можем настроить диапазон этой оси, которая в настоящее время идет от 0 до 100 .
Установка диапазона оси в Matplotlib
Теперь, если мы хотим усечь это представление на меньшее или даже большее, мы можем настроить пределы X и Y. Доступ к ним можно получить либо через экземпляр PyPlot, либо через экземпляр Axes .
Как установить X-Limit (xlim) в Matplotlib
Давайте сначала установим X-limit, используя как PyPlot, так и экземпляры Axes . Оба эти метода принимают кортеж — левый и правый пределы. Так, например, если мы хотим обрезать представление, чтобы отображать только данные в диапазоне 25-50 по оси X, мы бы использовали xlim([25, 50]) :
fig, ax = plt.subplots(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.xlim([25, 50])
Это ограничивает просмотр по оси X данными между 25 и 50 и приводит к:
Такого же эффекта можно добиться, задав их через объект ax . Таким образом, если у нас несколько Axes , мы можем установить лимит для них отдельно:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax = fig.add_subplot(121) ax2 = fig.add_subplot(122) ax.set_title('Full view') ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') ax2.set_title('Truncated view') ax2.plot(y, color='blue', label='Sine wave') ax2.plot(z, color='black', label='Cosine wave') ax2.set_xlim([25, 50]) plt.show()
Как установить Y-Limit (ylim) в Matplotlib
Теперь давайте установим Y-Limit. Этого можно добиться с помощью тех же двух подходов:
ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.ylim([-1, 0])
ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') ax.set_ylim([-1, 0])
Оба результата приводят к:
Вывод
В этом руководстве мы рассмотрели, как установить диапазон оси (т.е. пределы X и Y) с помощью Matplotlib в Python.
Визуализация в Python
- Другой пример — scatter (где точки не соединяются прямыми линиями), с указанием точек (x1,y1),(x2,y2),(x3,y3)…
x = np.linspace(0, 5, 50) # создаем массив из 100 чисел float от 0 до 5 с равномернов шагом y = x*(x - 2)*(x - 4) plt.figure(figsize=(8,4)) # можно указать явно ширину и высоту графика (строчка не обязательна) plt.scatter(x, y, label='line_1') plt.legend() # показывать легенду plt.grid(linewidth=1) # включить отрисовку сетки c определенными параметрами plt.yticks() plt.xticks() plt.xlabel('ось абсцисс') plt.ylabel('ось ординат');
- Гистограмма — график, показывающий распределение какой-либо величины, встречающуюся в данном объеме значений. По другому, график показыват сколько раз встречается из выборки каждое значение в ней. Построим гистограммы с помощью разных библиотек.
Один из главных параметров bins — обратная величина к ширине столбцов на графике
df['wage'].hist(figsize=(6, 4), bins=100);
sns.distplot(df['wage'], bins=10);
Можно сразу построить несколько гистограмм, относящихся к разным столбцам данных:
features = ['wage', 'exper'] df[features].hist(figsize=(10, 4), bins=60);
- CountPlot — столбчатая диаграмма, чаще всего используется для категориальных признаков в данных. Показывает, сколько трочек в df имеют каждое из выбранного значения категориального признака.
sns.countplot(x='female', data=df);
sns.countplot(y='female', data=df);
Приведем пример для столбца look относительно параметра female в DataFrame df
sns.countplot(x='female', hue='looks', data=df);
На следующем примере покажем, как нарисовать несколько графиков на одной картинке: axes — части графика. axes[0] — левая часть, а axes[1] — правая. Аналогично можно создать сетку 2х2 для 4х графиков (но для 4х графиков нужно указывать уже 2 координаты, например, ax=axis[1][1]).
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 4)) sns.countplot(x='female', data=df, ax=axes[0]); sns.countplot(x='looks', data=df, ax=axes[1]);
- Круговая диаграмма отлично показывает соотношение частей:
plt.pie(df.groupby('female')['wage'].count()); # круговая диаграмми (pie)
- Ящик с усами, или boxplot Box plot состоит из коробки (поэтому он и называется box plot), усиков и точек. Коробка показывает интерквартильный размах распределения, то есть соответственно 25% (Q1) и 75% (Q3) перцентили.
Черта внутри коробки обозначает медиану распределения.
Усы отображают весь разброс точек кроме выбросов, то есть минимальные и максимальные значения, которые попадают в промежуток (Q1 — 1.5IQR, Q3 + 1.5IQR), где IQR = Q3 — Q1 — интерквартильный размах.
Точками на графике обозначаются выбросы (outliers) — те значения, которые не вписываются в промежуток значений, заданный усами графика.
sns.boxplot(x='wage', data=df);
_, axes = plt.subplots(1, 2, sharey=True, figsize=(6, 4)) sns.boxplot(data=df['wage'], ax=axes[0]); sns.violinplot(data=df['wage'], ax=axes[1]);
Для большего понимания посмотреть на картинку из Wikipedia:
- joint plot: Для того, чтобы подробнее посмотреть на взаимосвязь двух численных признаков, есть еще и joint plot — это гибрид scatter plot и histogram. Посмотрим на то, как связаны между собой wage и exper.
sns.jointplot(x='wage', y='exper', data=df, kind='scatter');
sns.jointplot('exper', 'wage', data=df, kind="kde", color="r");
После всего вышесказанного, нужно отметить, что можно делать некоторые операции над DataFrame, и уже к ним применять метод .plot(…).
df.groupby('looks').wage.sum().plot(kind='bar', rot=75, color='green');
df[features].plot(kind='density', subplots=True, layout=(1, 2), sharex=False, figsize=(10, 4));
3D графики
from mpl_toolkits.mplot3d import Axes3D from sklearn import datasets from sklearn.decomposition import PCA # import some data to play with iris = datasets.load_iris() X = iris.data[:, :2] # we only take the first two features. y = iris.target x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5 y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5 X_reduced = PCA(n_components=3).fit_transform(iris.data) # To getter a better understanding of interaction of the dimensions # plot the first three PCA dimensions fig = plt.figure(1, figsize=(8, 6)) ax = Axes3D(fig, elev=-150, azim=110) ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y, cmap=plt.cm.Set1, edgecolor='k', s=40) ax.set_title("First three PCA directions") ax.set_xlabel("1st eigenvector") ax.w_xaxis.set_ticklabels([]) ax.set_ylabel("2nd eigenvector") ax.w_yaxis.set_ticklabels([]) ax.set_zlabel("3rd eigenvector") ax.w_zaxis.set_ticklabels([]) plt.show()
Создание анимации
import matplotlib.animation as animation from matplotlib.animation import PillowWriter import matplotlib.lines as mlines from sklearn.datasets import load_iris from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split def newline(p1, p2, color=None): # функция отрисовки линии #function kredits to: https://fooobar.com/questions/626491/how-to-draw-a-line-with-matplotlib ax = plt.gca() xmin, xmax = ax.get_xbound() if(p2[0] == p1[0]): xmin = xmax = p1[0] ymin, ymax = ax.get_ybound() else: ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0]) ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0]) l = mlines.Line2D([xmin,xmax], [ymin,ymax], color=color) ax.add_line(l) return l def one_image(w, X, Y): # фунцкия отрисовки одного кадра axes = plt.gca() axes.set_xlim([-4,4]) axes.set_ylim([-1.5,1.5]) d1 = -1:'green', 1:'red'> im = plt.scatter(X[:,0], X[:,1], c=[d1[y] for y in Y]) im = newline([0,-w[2]/w[1]],[-w[2]/w[0],0], 'blue') return im # блок подготовки данных iris = load_iris() X = iris.data Y = iris.target pca = PCA(n_components=2) X = pca.fit_transform(X) Y = (Y == 2).astype(int)*2-1 # [0,1,2] --> [False,False,True] --> [0,1,1] --> [0,0,2] --> [-1,1,1] X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4, random_state=2020) history_w = np.array([[ 1.40100620e-02, 3.82414425e-02, 9.29992169e-03], [ 9.34759319e-02, 1.38405275e-02, -2.07000784e-02], [ 1.77059209e-01, 2.08938874e-02, -5.07000782e-02], [ 2.57582976e-01, 1.13119698e-02, -8.07000777e-02], [ 2.57845336e-01, 3.30044268e-02, -1.10700077e-01], [ 2.48875308e-01, 4.34713607e-02, -1.40700076e-01], [ 2.10330535e-01, 2.29165461e-02, -1.70700074e-01], [ 2.88030722e-01, 1.60452308e-02, -2.00700073e-01], [ 3.65670311e-01, 6.38421381e-04, -2.30700071e-01], [ 4.22698556e-01, 4.13726013e-03, -2.00700068e-01], [ 3.91374597e-01, -2.71359690e-03, -2.30700066e-01], [ 4.56157722e-01, -9.23192424e-03, -2.00700064e-01], [ 4.56157718e-01, -9.23192415e-03, -2.00700062e-01], [ 4.56157713e-01, -9.23192405e-03, -2.00700060e-01], [ 5.15303640e-01, -1.46237611e-02, -1.70700058e-01], [ 5.15303635e-01, -1.46237609e-02, -1.70700056e-01], [ 5.15303630e-01, -1.46237608e-02, -1.70700055e-01], [ 5.15303625e-01, -1.46237607e-02, -1.70700053e-01], [ 5.15303619e-01, -1.46237605e-02, -1.70700051e-01], [ 5.51273647e-01, -3.28065062e-02, -1.40700049e-01], [ 5.51273642e-01, -3.28065059e-02, -1.40700048e-01], [ 5.51273636e-01, -3.28065055e-02, -1.40700047e-01], [ 5.66508857e-01, 5.17263051e-03, -1.70700045e-01], [ 5.66508852e-01, 5.17263046e-03, -1.70700044e-01], [ 5.66508846e-01, 5.17263040e-03, -1.70700042e-01], [ 5.66508840e-01, 5.17263035e-03, -1.70700040e-01], [ 5.48868641e-01, 1.97012529e-02, -2.00700038e-01], [ 5.48868636e-01, 1.97012527e-02, -2.00700036e-01], [ 5.48868630e-01, 1.97012525e-02, -2.00700034e-01], [ 5.54086386e-01, 2.73468786e-02, -2.30700032e-01], [ 5.96543457e-01, 1.00993879e-02, -2.00700030e-01], [ 5.96543451e-01, 1.00993878e-02, -2.00700028e-01], [ 5.96543445e-01, 1.00993877e-02, -2.00700026e-01], [ 6.38206423e-01, 3.96740775e-03, -1.70700024e-01], [ 6.38206417e-01, 3.96740771e-03, -1.70700022e-01], [ 6.11201179e-01, -5.88772655e-03, -2.00700021e-01], [ 6.52906839e-01, -1.43675546e-02, -1.70700019e-01], [ 6.52906832e-01, -1.43675545e-02, -1.70700017e-01], [ 6.52906826e-01, -1.43675543e-02, -1.70700015e-01], [ 6.42197374e-01, 7.79748602e-04, -2.00700014e-01], [ 6.03251852e-01, 1.06133678e-02, -2.30700012e-01], [ 6.03251846e-01, 1.06133677e-02, -2.30700009e-01], [ 6.05295634e-01, 3.17685316e-02, -2.60700007e-01], [ 6.05295628e-01, 3.17685313e-02, -2.60700004e-01], [ 6.05295622e-01, 3.17685310e-02, -2.60700002e-01], [ 5.85487103e-01, 4.23576206e-02, -2.90699999e-01], [ 5.85487097e-01, 4.23576202e-02, -2.90699996e-01], [ 5.57651268e-01, 2.83422349e-02, -3.20699993e-01], [ 5.53558401e-01, 3.77632078e-02, -3.50699990e-01], [ 5.12157603e-01, 5.03918360e-02, -3.80699987e-01]]) fig = plt.figure() ims = [] # набиваем в этот список кадры с помощью цикла for i in range(50): im = one_image(history_w[i], X_train, Y_train) ims.append([im]) ani = animation.ArtistAnimation(fig, ims, interval=20, blit=True, # используем волшебную команду repeat_delay=500) writer = PillowWriter(fps=20) # устанавливаем фпс ani.save("my_demo.gif", writer='imagemagick') # сохраняем
MovieWriter imagemagick unavailable; trying to use instead.
Домашнее задание:
- ДЗ по 2м последним лабам (15 — pandas, 16 — визуализация): Нужно взять данные отсюда: https://github.com/Laggg/data–for–students (flight_delays.csv)
- для каждой задачи получить ответ на вопрос через pandas и визуализировать его любым подходящим способом (у всех графиков должна быть легенда, подписаны оси):
- доля всех задержек ко всем вылетам
- найти зависимость количества задержек от длины пути, который предстоит пролететь самолету
- топ 5 направлений, для которых чаще всего происходят задержки
- в какие времена года чаще всего происходят задержки рейсов
- найти топ 10 самых хороших перевозчиков, которые реже всего задерживают свои рейсы
- найти топ 10 самых безответственных аэропортов, в которых чаще всего происходят задержки
- найти необычную зависимость количества задержек от имеющихся данных
import pandas as pd pd.read_csv('flight_delays.csv').head(10)
Month | DayofMonth | DayOfWeek | DepTime | UniqueCarrier | Origin | Dest | Distance | dep_delayed_15min | |
---|---|---|---|---|---|---|---|---|---|
0 | c-8 | c-21 | c-7 | 1934 | AA | ATL | DFW | 732 | N |
1 | c-4 | c-20 | c-3 | 1548 | US | PIT | MCO | 834 | N |
2 | c-9 | c-2 | c-5 | 1422 | XE | RDU | CLE | 416 | N |
3 | c-11 | c-25 | c-6 | 1015 | OO | DEN | MEM | 872 | N |
4 | c-10 | c-7 | c-6 | 1828 | WN | MDW | OMA | 423 | Y |
5 | c-8 | c-3 | c-4 | 1918 | NW | MEM | MCO | 683 | N |
6 | c-1 | c-27 | c-4 | 754 | DL | PBI | LGA | 1035 | N |
7 | c-4 | c-29 | c-6 | 635 | OH | MSP | CVG | 596 | N |
8 | c-7 | c-28 | c-5 | 735 | AA | ONT | DFW | 1189 | N |
9 | c-6 | c-20 | c-2 | 2029 | OO | DEN | PSC | 853 | N |
Очень полезные ссылки:
- https://habr.com/ru/post/468295/
- https://habr.com/ru/company/ods/blog/323210/
Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.
Matplotlib. Урок 3.3. Настройка графиков. Текстовые элементы графика
В этом уроке будут подробно рассмотрены текстовые элементы графика, такие как заголовок подложки и поля графика, подписи осей, текстовые блоки и аннотации.
- Текстовые элементы графика
- Заголовок подложки и поля графика
- Подписи осей графика
- Текстовый блок
- Аннотация
- Стиль стрелки
- Стиль соединительной линии
Текстовые элементы графика
В части текстового наполнения при построении графика выделяют следующие составляющие:
- заголовок поля ( title );
- заголовок фигуры ( suptitle );
- подписи осей ( xlabel , ylabel );
- тестовый блок на поле графика ( text ), либо на фигуре ( figtext );
- аннотация ( annotate ) – текст и указатель.
У каждого элемента, который содержит текст, помимо специфических параметров, отвечающих за его настройку, есть параметры класса Text , которые открывают доступ к довольно большому числу настроек внешнего вида и расположения текстового элемента. Более подробно описание параметров, доступных из класса Text , будет дано в одном из следующих уроков.
Ниже представлен код, отображающий все указанные выше текстовые элементы.
plt.figure(figsize=(10,4)) plt.figtext(0.5, -0.1, "figtext") plt.suptitle("suptitle") plt.subplot(121) plt.title("title") plt.xlabel("xlabel") plt.ylabel("ylabel") plt.text(0.2, 0.2, "text") plt.annotate("annotate", xy=(0.2, 0.4), xytext=(0.6, 0.7), arrowprops=dict(facecolor='black', shrink=0.05)) plt.subplot(122) plt.title("title") plt.xlabel("xlabel") plt.ylabel("ylabel") plt.text(0.5, 0.5, "text")
Большую часть из представленные текстовых элементов мы рассмотрели в “ Matplotlib . Урок 2. Работа с инструментом pyplot ”, в этом уроке изучим их более подробно.
Элементы графика, которые содержат текст, имеют ряд настроечных параметров, которые в официальной документации определяются как **kwargs . Это свойства класса matplotlib.text.Text , используемые для управления представлением текста.
Заголовок фигуры и поля графика
Начнем с заголовка поля графика. Текст заголовка для поля устанавливается с помощью функции title() , которая имеет следующие основные аргументы:
- label : str
- Текст заголовка.
- Словарь для управления отображением надписи, содержит следующие ключи:
- ‘fontsize’ : размер шрифта,
- ‘fontweight’ : начертание ,
- ‘verticalalignment’ : вертикальное выравнивание,
- ‘horizontalalignment’ : горизонтальное выравнивание.
- Горизонтальное выравнивание.
- Зазор между заголовком и верхней частью поля графика.
Функция title() также поддерживает в качестве аргументов свойства класса Text :
weight=['light', 'regular', 'bold'] plt.figure(figsize=(12, 4)) for i, lc in enumerate(['left', 'center', 'right']): plt.subplot(1, 3, i+1) plt.title(label=lc, loc=lc, fontsize=12+i*5, fontweight=weight[i], pad=10+i*15)
Заголовок фигуры задается с помощью функции suptitle() , аргументы этой функции аналогичны тем, что были рассмотрены для title() .
Подписи осей графика
Если вы работаете с pyplot , то для установки подписей осей графика используются функции labelx() и labely() . При работе с объектом Axes для этих целей подходят функции set_xlabel() и set_ylabel() .
Основные аргументы функций почти полностью совпадают с теми, что были описаны в функции title() :
- label : str
- Текст подписи.
- Словарь для управления отображением надписи, содержит следующие ключи:
- ‘fontsize’ : размер шрифта,
- ‘fontweight’ : начертание ,
- ‘verticalalignment’ : вертикальное выравнивание,
- ‘horizontalalignment’ : горизонтальное выравнивание.
- Зазор между подписью и осью.
В самом простом случае достаточно передать только подпись в виде строки:
x = [i for i in range(10)] y = [i*2 for i in range(10)] plt.plot(x, y) plt.xlabel("Ось X") plt.ylabel("Ось Y")
Используемые некоторые из дополнительных свойств для настройки внешнего вида подписей осей:
plt.plot(x, y) plt.xlabel("Ось X\nНезависимая величина", fontsize=14, fontweight="bold") plt.ylabel("Ось Y\nЗависимая величина", fontsize=14, fontweight="bold")
Текстовый блок
За установку текстовых блоков на поле графика отвечает функция text() . Через основные параметры этой функции можно задать расположение, содержание и настройки шрифта:
- x: float
- Значение координаты x надписи.
- Значение координаты y надписи.
- Текст надписи.
Для более тонкой настройки внешнего вида воспользуйтесь свойствами класса Text .
В простейшем варианте использование text() будет выглядеть так:
plt.text(0, 7, "HELLO!", fontsize=15) plt.plot(range(0,10), range(0,10))
Использование свойств класса Text , позволяет значительно модифицировать это представление:
bbox_properties=dict( boxstyle="darrow, pad=0.3", ec="k", fc="y", ls="-", lw=3 ) plt.text(2, 7, "HELLO!", fontsize=15, bbox=bbox_properties) plt.plot(range(0,10), range(0,10))
Аннотация
Инструмент Аннотация позволяет установить текстовый блок с заданным содержанием и стрелкой для конкретного места на графике. Аннотация – это мощный инструмент, остановимся на нем более подробно.
Для создания аннотации используется функция annotate() , основными ее аргументами являются:
- text : str
- Текст аннотации.
- Координаты места, на которое будет указывать стрелка.
- Координаты расположения текстовой надписи.
- Система координат, в которой определяется расположение указателя.
- Система координат, в которой определяется расположение текстового блока.
- Параметры отображения стрелки. Имена этих параметров (ключи словаря) являются параметрами конструктора объекта класса FancyArrowPatch .
Ниже представлен пример кода, который демонстрирует простой вариант использования annotation() :
import math x = list(range(-5, 6)) y = [i**2 for i in x] plt.annotate('min', xy=(0, 0), xycoords='data', xytext=(0, 10), textcoords='data', arrowprops=dict(facecolor='g')) plt.plot(x, y)
Параметрам xycoords и textcoords может быть присвоено значение из следующей таблицы:
Значение Описание ‘figure points’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в точках. ‘figure pixels’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в пикселях. ‘figure fraction’ Начало координат – это нижний левый угол фигуры (0, 0) при этом верхний правый угол – это точка (1, 1). Координаты задаются в долях от единицы. ‘axes points’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в точках. ‘axes pixels’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в пикселях. ‘axes fraction’ Начало координат – это нижний левый угол поля графика (0, 0) при этом верхний правый угол поля – это точка (1, 1). Координаты задаются в долях от единицы. ‘data’ Тип координатной системы: декартова. Работа ведется в пространстве поля графика. ‘polar’ Тип координатной системы: полярная. Работа ведется в пространстве поля графика. Рассмотрим настройку внешнего вида стрелки аннотации. За конфигурирование отображения стрелки отвечает параметр arrowprops , который принимает в качестве значения словарь, ключами которого являются параметры конструктора класса FancyArrowPatch , из них выделим два: arrowstyle , который отвечает за стиль стрелки и connectionstyle – отвечает за стиль соединительной линии.
Стиль стрелки
Параметр: arrowstyle
Тип: str, ArrowStyle, optional
Доступные стили стрелок представлены в таблице и на рисунке ниже.
Класс Имя Атрибуты Curve – None CurveB -> head_length=0.4, head_width=0.2 BracketB -[ widthB=1.0, lengthB=0.2, angleB=None CurveFilledB -|> head_length=0.4, head_width=0.2 CurveA head_length=0.4, head_width=0.2 CurveAB head_length=0.4, head_width=0.2 CurveFilledA <|- head_length=0.4, head_width=0.2 CurveFilledAB head_length=0.4, head_width=0.2 BracketA ]- widthA=1.0, lengthA=0.2, angleA=None BracketAB ]-[ widthA=1.0, lengthA=0.2, angleA=None, widthB=1.0, lengthB=0.2, angleB=None Fancy fancy head_length=0.4, head_width=0.4, tail_width=0.4 Simple simple head_length=0.5, head_width=0.5, tail_width=0.2 Wedge wedge tail_width=0.3, shrink_factor=0.5 Программный код для построения изображения:
plt.figure(figsize=(7,5)) arrows = ["-", "->", "-[", "|-|", "-|>", "", "<|-", "<|-|>", "fancy", "simple", "wedge"] bbox_properties=dict( boxstyle="round,pad=0.2", ec="k", fc="w", ls="-", lw=1 ) ofs_x = 0 ofs_y = 0 for i, ar in enumerate(arrows): if i == 6: ofs_x = 0.5 plt.annotate(ar, xy=(0.4+ofs_x, 0.92-ofs_y), xycoords='data', xytext=(0.05+ofs_x, 0.9-ofs_y), textcoords='data', fontsize=17, bbox=bbox_properties, arrowprops=dict(arrowstyle=ar) ) if ofs_y == 0.75: ofs_y = 0 else: ofs_y += 0.15
Стиль соединительной линии
Параметр: connectionstyle
Тип: str, ConnectionStyle, or None, optional
Через данный параметр можно задать описание стиля линии, которая соединяет точки ( xy, xycoords ). В качестве значения данный параметр может принимать объект класса ConnectionStyle , или строку, в которой указывается стиль линии соединения с параметрами, перечисленными через запятую.
Класс Имя Атрибуты Angle angle angleA=90, angleB=0, rad=0.0 Angle3 angle3 angleA=90, angleB=0 Arc arc angleA=0, angleB=0, armA=None, armB=None, rad=0.0 Arc3 arc3 rad=0.0 Bar bar armA=0.0, armB=0.0, fraction=0.3, angle=None Ниже представлен пример, который демонстрирует возможности работы с параметром connectionstyle :
import math fig, axs = plt.subplots(2, 3, figsize=(12, 7)) conn_style=[ "angle,angleA=90,angleB=0,rad=0.0", "angle3,angleA=90,angleB=0", "arc,angleA=0,angleB=0,armA=0,armB=40,rad=0.0", "arc3,rad=-1.0", "bar,armA=0.0,armB=0.0,fraction=0.1,angle=70", "bar,fraction=-0.5,angle=180", ] for i in range(2): for j in range(3): axs[i, j].text(0.1, 0.5, "\n".join(conn_style[i*3+j].split(","))) axs[i, j].annotate('text', xy=(0.2, 0.2), xycoords='data', xytext=(0.7, 0.8), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle=conn_style[i*3+j]) )
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Matplotlib. Урок 3.4. Настройка графиков. Свойства класса Text
В этом уроке будут рассмотрены свойства класса matplotlib.text.Text, которые используются для тонкой настройки внешнего вида текста на элементах Matplotlib.
- Параметры, отвечающие за отображения текста
- Параметры, отвечающие за расположение надписи
- Параметры, отвечающие настройку заднего фона надписи
Мы не будем рассматривать все свойства класса Text , сделаем обзор только на наиболее часто используемые.
Параметры, отвечающие за отображения текста
- alpha: float
- Уровень прозрачности надписи. Параметр задается числом в диапазоне от 0 до 1. 0 – полная прозрачность, 1 – полная непрозрачность.
- Цвет текста. Значение параметра имеет тоже тип, что и параметр функции plot , отвечающий за цвет графика. Более подробная информация по его использованию представлена в Matplotlib. Урок 2. Работа с инструментом pyplot
- Шрифт текста, задается в виде строки из следующего набора: . Можно использовать свой шрифт.
- Размер шрифта, можно выбрать из ряда: , либо задать его в виде численного значения.
- Стиль шрифта, задается из следующего набора .
- Начертание шрифта, задается из следующего набора .
- Насыщенность шрифта, задается из следующего набора либо численным значением в диапазоне 0-1000 .
Рассмотрим пример, демонстрирующий использование перечисленных выше параметров:
plt.title("Title", alpha=0.5, color="r", fontsize=18, fontstyle="italic", fontweight="bold", linespacing=10) plt.plot(range(0,10), range(0,10))
Для группового задания свойств можно использовать параметр fontproperties или font_properties , которому в качестве значения можно передать объект класса font_manager.FontProperties . Данный объект создается следующим образом:
FontProperties(family=None, style=None, variant=None, weight=None, stretch=None, size=None, fname=None)
Типы параметров конструктора такие же как у параметров, отвечающих за отображение шрифта.
Не забудьте предварительно импортировать FontProperties прежде, чем его использовать:
from matplotlib.font_manager import FontProperties plt.title("Title", fontproperties=FontProperties(family="monospace", style="italic", weight="heavy", size=15)) plt.plot(range(0,10), range(0,10))
Параметры, отвечающие за расположение надписи
Для надписи можно задать выравнивание, позицию, вращение и z -порядок:
- horizontalalignment (или ha ): str
- Горизонтальное выравнивание, задается из следующего набора .
- Вертикальное выравнивание, задается из следующего набора .
- Позиция надписи, определяется двумя координатами x и y , которые передаются в параметр position в виде кортежа из двух элементов.
- Вращение. Ориентацию надписи можно задать в виде текста либо численно – значение в градусах.
- Режим вращения. Данный параметр определяет очередность вращения и выравнивания. Если он равен ‘default’ , то вначале производится вращение, а потом выравнивание. Если равен ‘anchor’ , то наоборот.
- Порядок расположения. Значение параметра определяет очередность вывода элементов. Элемент с минимальным значением zorder выводится первым.
Рассмотрим на примере заголовка использование параметров задания расположения:
plt.title("Title", fontsize=17, position=(0.7, 0.2), rotation="vertical") plt.plot(range(0,10), range(0,10))
Параметры, отвечающие настройку заднего фона надписи
- backgroundcolor : color
- Цвет заднего фона
Если требуется более тонкая настройка с указанием цвета, толщины, типа рамки, цвета основной заливки и т.п., то используйте параметр bbox , его значением – это словарь, ключами которого являются свойства класса patches.FancyBboxPatch :
Свойство Тип значения Описание boxstyle str или matplotlib.patches.BoxStyle Стиль рамки. См. таблицу ниже alpha float или None Прозрачность color color Цвет edgecolor или ec color или None или ‘auto’ Цвет границы рамки facecolor или fc color или None Цвет заливки fill bool Заливка (использовать или нет) hatch Штриховка linestyle или ls Стиль линии рамки linewidth или lw float или None Толщина линии Параметры boxstyle :
Класс Имя Атрибуты Внешний вид Circle circle pad=0.3 DArrow darrow pad=0.3 LArrow larrow pad=0.3 RArrow rarrow pad=0.3 Round round pad=0.3, rounding_size=None Round4 round4 pad=0.3, rounding_size=None Roundtooth roundtooth pad=0.3, tooth_size=None Sawtooth sawtooth pad=0.3, tooth_size=None Square square pad=0.3 Ниже представлен пример оформления заднего фона надписи:
from matplotlib.patches import FancyBboxPatch bbox_properties=dict( boxstyle="rarrow, pad=0.3", ec="g", fc="r", ls="-", lw=3 ) plt.title("Title", fontsize=17, bbox=bbox_properties, position=(0.5, 0.85)) plt.plot(range(0,10), range(0,10))
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.