Как подписать график в питоне
Перейти к содержимому

Как подписать график в питоне

  • автор:

Как подписать оси на графике в Matplotlib Pyplot

Подскажите пожалуйста как подписать оси на графике построенном в библиотеке Matplotlib pyplot если оси выровнены по центру. Вот мой код:

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position("center") ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue') ax.set_ylabel("Y", fontsize=15, color='orange') plt.show() 

вот я выставил оси, но они выставились очень криво( Может есть какой-то атрибут выравнивания?

Отслеживать
25.7k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 22 сен 2020 в 19:12
111 4 4 серебряных знака 10 10 бронзовых знаков
Вот я выставил оси, но они почему-то выставились криво((( Может есть какие-то атрибуты выравнивания?
22 сен 2020 в 19:15
что именно у вас выставилось криво?
22 сен 2020 в 19:21

@strawdog ну видите на картинке синий X и оранжевый игрек. Хотелось бы чтобы они было в другом виде. Ну как всегда мы графики подписываем

22 сен 2020 в 19:37

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Попробуйте добавить labelpad

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue', labelpad=120) # + ax.set_ylabel("Y", fontsize=15, color='orange', labelpad=140) # + ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') plt.show() 

введите сюда описание изображения

А случайно не знаете, игрек можно перевернуть или тут уже всё?

Попробуйте добавить rotation

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue', labelpad=120) # + ax.set_ylabel("Y", fontsize=15, color='orange', labelpad=140, rotation=0) # + ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') plt.show() 

Пострение графиков

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

Например, y = x², должно быть записано как y = x*x или y = x**2 .

Упражнение №1

Запишите выражение, заданное формулой, в виде, подходящем для языка Python.

и найдите его значения в точках 1, 10, 1000.

Для вычисления математических функций мы не будем использовать стандартную библиотеку math. Т.к. она не работает с векторами. В нашем случае разумней обратить внимание на библиотеку numpy. Данная библиотека обеспечивает удобную работу с векторам.

Т.е., если у нас есть вектор x=[1, 2, 3, 4] и мы вызовим numpy.log(x), то логарифм будет взят от каждого элемента списка и возвращен будет список значений.

Аналогичная функция в модуля math ожидает число, т.е. нельзя сделать math.log(x), нужно делать math.log(x[0]) и т.д.

Традиционно библиотека numpy подключается командой:

import numpy as np 

Данный вызов сообщает, что подключить numpy под псевдонимом np. Это делается, чтобы не писать каждый раз:

numpy.cos(x) 
np.cos(x) 

Такой код, с более коротким именем библиотеки, элементарно, проще читать.

Основные математические функции и константы функии, которые нам понадобятся из numpy:

Функция библиотеки math Математическая функция
np.pi Число pi
np.e Число e
np.cos Косинус
np.sin Синус
np.tan Тангенс
np.acos Арккосинус
np.asin Арксинус
np.atan Арктангенс
np.exp Экспонента
np.log Логарифм

Функция log вычисляет натуральный логарифм. Чтобы вычислить логарифм по другому основанию, нужно воспользоваться формулой перехода. Например, если мы хотим получить логарифм x по основанию 2, нужно написать:

np.log(x) / np.log(2) 

Построение графиков

matplotlib — набор дополнительных модулей (библиотек) языка Python. Предоставляет средства для построения самых разнообразных 2D графиков и диаграмм данных. Отличается простотой использования — для построения весьма сложных и красочно оформленных диаграмм достаточно нескольких строк кода. При этом качество получаемых изображений более чем достаточно для их публикования. Также позволяет сохранять результаты в различных форматах, например Postscript, и, соответственно, вставлять изображения в документы TeX. Предоставляет API для встраивания своих графических объектов в приложения пользователя.

Пример построения графика функции:

import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10.01, 0.01) plt.plot(x, x**2) plt.show() 

На одном рисунке можно построить несколько графиков функций:

import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10.01, 0.01) plt.plot(x, np.sin(x), x, np.cos(x), x, -x) plt.show() 

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

import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10.01, 0.01) plt.plot(x, np.sin(x), x, np.cos(x), x, -x) plt.xlabel(r'$x$') plt.ylabel(r'$f(x)$') plt.title(r'$f_1(x)=\sin(x),\ f_2(x)=\cos(x),\ f_3(x)=-x$') plt.grid(True) plt.show() 

Или используя legend() , где можно указать место расположения подписей к кривым на графике в параметре loc . Подписи могут быть явно переданы legend((line1, line2, line3), (‘label1’, ‘label2’, ‘label3’)) или могут быть переданы в аргумет label , как в примере ниже. Чтобы сохранить график нужно воспользоваться savefig(figure_name) , где figure_name явлется строкой назания файла с указанием расширения. Для текстовых полей можно изменять шрифт ( fontsize ), для большей читаемости графика, а его размер указывается с помощью figure(figsize=(10, 5)) .

import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10.01, 0.01) plt.figure(figsize=(10, 5)) plt.plot(x, np.sin(x), label=r'$f_1(x)=\sin(x)$') plt.plot(x, np.cos(x), label=r'$f_2(x)=\cos(x)$') plt.plot(x, -x, label=r'$f_3(x)=-x$') plt.xlabel(r'$x$', fontsize=14) plt.ylabel(r'$f(x)$', fontsize=14) plt.grid(True) plt.legend(loc='best', fontsize=12) plt.savefig('figure_with_legend.png') plt.show() 

Текстовые поля в matplotlib могут содержать разметку LaTeX, заключенную в знаки $. Буква r перед кавычками говорит python, что символ «\» следует оставить как есть и не интерпретировать как начало спецсимвола (например, перевода строки — «\n»).

Работа с matplotlib основана на использовании графических окон и осей (оси позволяют задать некоторую графическую область). Все построения применяются к текущим осям. Это позволяет изображать несколько графиков в одном графическом окне. По умолчанию создаётся одно графическое окно figure(1) и одна графическая область subplot(111) в этом окне. Команда subplot позволяет разбить графическое окно на несколько областей. Она имеет три параметра: nr , nc , np . Параметры nr и nc определяют количество строк и столбцов на которые разбивается графическая область, параметр np определяет номер текущей области ( np принимает значения от 1 до nr*nc ). Если nr*nc

import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10.01, 0.01) t = np.arange(-10, 11, 1) #subplot 1 sp = plt.subplot(221) plt.plot(x, np.sin(x)) plt.title(r'$\sin(x)$') plt.grid(True) #subplot 2 sp = plt.subplot(222) plt.plot(x, np.cos(x), 'g') plt.axis('equal') plt.grid(True) plt.title(r'$\cos(x)$') #subplot 3 sp = plt.subplot(223) plt.plot(x, x**2, t, t**2, 'ro') plt.title(r'$x^2$') #subplot 4 sp = plt.subplot(224) plt.plot(x, x) sp.spines['left'].set_position('center') sp.spines['bottom'].set_position('center') plt.title(r'$x$') plt.show() 

График может быть построен в полярной системе координат, для этого при создании subplot необходимо указать параметр polar=True :

import numpy as np import matplotlib.pyplot as plt plt.subplot(111, polar=True) phi = np.arange(0, 2*np.pi, 0.01) rho = 2*phi plt.plot(phi, rho, lw=2) plt.show() 

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

import numpy as np import matplotlib.pyplot as plt t = np.arange(0, 2*np.pi, 0.01) r = 4 plt.plot(r*np.sin(t), r*np.cos(t), lw=3) plt.axis('equal') plt.show() 

График функции двух переменных может быть построен, например, так:

from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np ax = axes3d.Axes3D(plt.figure()) i = np.arange(-1, 1, 0.01) X, Y = np.meshgrid(i, i) Z = X**2 - Y**2 ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) plt.show() 

Добавление текста на график: Команду text() можно использовать для добавления текста в произвольном месте (по умолчанию координаты задаются в координатах активных осей), а команды xlabel() , ylabel() и title() служат соответственно для подписи оси абсцисс, оси ординат и всего графика. Для более полной информации смотрите «Text introduction» раздел на оф. сайте.

import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # the histogram of the data n, bins, patches = plt.hist(x, 50, density=True, facecolor='g', alpha=0.75) plt.xlabel('Smarts') plt.ylabel('Probability') plt.title('Histogram of IQ') plt.text(60, .030, r'$\mu=100,\ \sigma=15$') plt.text(50, .033, r'$\varphi_<\mu,\sigma^2>(x) = \frac <\sigma\sqrt<2\pi>> \,e^< -\frac<(x- \mu)^2>> = \frac  \varphi\left(\frac\right),\quad x\in\mathbb $', fontsize=20, color='red') plt.axis([40, 160, 0, 0.04]) plt.grid(True) plt.show() 

plot() — универсальная команда и в неё можно передавать произвольное количество аргументов. Например, для того, чтобы отобразить y в зависимости от x , можно выполнить команду:

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) plt.show() 

Каждую последовательность можно отобразить своим типом точек:

import numpy as np import matplotlib.pyplot as plt # равномерно распределённые значения от 0 до 5, с шагом 0.2 t = np.arange(0., 5., 0.2) # красные чёрточки, синие квадраты и зелёные треугольники plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^') plt.show() 

Также в matplotlib существует возможность строить круговые диаграммы:

import numpy as np import matplotlib.pyplot as plt data = [33, 25, 20, 12, 10] plt.figure(num=1, figsize=(6, 6)) plt.axes(aspect=1) plt.title('Plot 3', size=14) plt.pie(data, labels=('Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5')) plt.show() 

И аналогичным образом столбчатые диаграммы:

import numpy as np import matplotlib.pyplot as plt objects = ('A', 'B', 'C', 'D', 'E', 'F') y_pos = np.arange(len(objects)) performance = [10,8,6,4,2,1] plt.bar(y_pos, performance, align='center', alpha=0.5) plt.xticks(y_pos, objects) plt.ylabel('Value') plt.title('Bar title') plt.show() 

Цветовые карты используются, если нужно указать в какие цвета должны окрашиваться участки трёхмерной поверхности в зависимости от значения Z в этой области. Цветовую карту можно задать самому, а можно воспользоваться готовой. Рассмотрим использование цветовой карты на примере графика функции z(x,y)=sin(x)*sin(y)/(x*y) .

import pylab from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import numpy def makeData(): x = numpy.arange(-10, 10, 0.1) y = numpy.arange(-10, 10, 0.1) xgrid, ygrid = numpy.meshgrid(x, y) zgrid = numpy.sin(xgrid)*numpy.sin(ygrid)/(xgrid*ygrid) return xgrid, ygrid, zgrid x, y, z = makeData() fig = pylab.figure() axes = Axes3D(fig) axes.plot_surface(x, y, z, rstride=4, cstride=4, cmap=cm.jet) pylab.show() 

Альтернативой к использованию mpl_toolkits.mplot3d является библиотека plotly , которая позволяет интерактивно взаимодействовать с графиком, поворачивая его или увеличивая некоторую область в пространсте.

Функция eval()

В Python есть встроенная функция eval() , которая выполняет строку с кодом и возвращает результат выполнения:

>>> eval("2 + 3*len('hello')") 17 >>> 

Это очень мощная, но и очень опасная инструкция, особенно если строки, которые вы передаёте в eval , получены не из доверенного источника. Если строкой, которую мы решим скормить eval() , окажется «os.system(‘rm -rf /’)» , то интерпретатор честно запустит процесс удаления всех данных с компьютера.

Упражнение №2

Постройте график функции

и по графику найдите найдите корни уравнения y(x) = 0. (Не нужно применять численных методов — просто приблизьте график к корням функции настолько, чтобы было удобно их найти.)

Упражнение №3

Постройте график функции

Упражнение №4

Используя функцию eval() постройте график функции, введённой с клавиатуры. Чтобы считать данные с клавиатуры, используйте функцию input() . Попробуйте включить эффект «рисование от руки» посредством вызова plt.xkcd() . Посольку эта функция применяет некоторый набор настроек, избавиться от которых впоследствие не так просто, удобнее использовать ее как «контекстный менеджер» — это позволяет применить настройки временно, только к определенному блоку кода. Для этого используется ключевое слово with:

with plt.xkcd(): plt.pie([70, 10, 10, 10], labels=('В комментариях', 'В Ираке', 'В Сирии', 'В Афганистане')) plt.title('Где ведутся самые ожесточенные бои') 

Отображение погрешностей

С помощью метода plt.errorbar можно рисовать точки с погрешностями измерений, как для лабораторных работ. Погрешности по осям абсцисс и ординат задаются в параметрах (соответственно) xerr и yerr .

import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [0.99, 0.49, 0.35, 0.253, 0.18] plt.errorbar(x, y, xerr=0.05, yerr=0.1) plt.grid() plt.show() 

Альтернативой для plt.errorbar может слудить plt.fill_between , который заполняет область графика между кривыми, чтобы регулировать прозрачность используется аргумент alpha . Это число из отрезка [0, 1], на которое домножоается интенсивность цвета заполнения между кривыми.

import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 10, 0.01) plt.plot(x, x**2, label=r'$f = x^2$') plt.scatter(x, x**2 + np.random.randn(len(x))*x, s=0.3) plt.fill_between(x, 1.3*x**2, 0.7*x**2, alpha=0.3) plt.legend(loc='best') plt.savefig('figure_fill_between.png') plt.show() 

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

x = [1, 2, 3, 4, 5, 6] y = [1, 1.42, 1.76, 2, 2.24, 2.5] p, v = np.polyfit(x, y, deg=1, cov=True) >>> p array([0.28517032, 0.80720757]) >>> v array([[0.00063242, -0.00221348], [-0.00221348, 0.00959173]]) 

Многочлен задается формулой p(x) = p[0] * x**deg + . + p[deg]

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

p_f = np.poly1d(p) p_f(0.5) p_f([1, 2, 3]) 

Упражнение №5

Приблизить данные из приведённого примера с погрешностями или свои собственные (из лабораторного практикума по общей физике) многочленами первой и второй степени. Начертить точки с погрешностями и полученные аппроксимационные кривые на одном графике.

Упражнение №6 *

Постройте график функции Вейерштрасса

Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.

Matplotlib. Урок 3.3. Настройка графиков. Текстовые элементы графика

Follow us on Google Plus Follow us on rss

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

  • Текстовые элементы графика
    • Заголовок подложки и поля графика
    • Подписи осей графика
    • Текстовый блок
    • Аннотация
      • Стиль стрелки
      • Стиль соединительной линии

      Текстовые элементы графика

      В части текстового наполнения при построении графика выделяют следующие составляющие:

      • заголовок поля ( 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. Работа с данными”.

                  Размещаем стандартные текстовые элементы на графике

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

                  import numpy as np import matplotlib.pyplot as plt y = np.arange(0, 5, 1) x = np.array([a*a for a in y]) y2 = [0, 2, 3, 4, 5, 7] x2 = [i+1 for i in y2] lines = plt.plot(x, y, x2, y2) plt.grid() plt.show()

                  И сетка появится сформируется в текущих координатных осях:

                  Причем, ее размеры будут автоматически подстраиваться под размер осей (объекта Axes).

                  Помимо обычной крупной сетки (major grid) можно наложить более мелкую (minor grid) минорную сетку. Для этого сначала нужно включить режим отображения минорной сетки:

                  plt.minorticks_on()

                  А, затем, в функции grid() прописать два типа сеток (мажорную и минорную):

                  plt.grid(which='major', color = '#444', linewidth = 1) plt.grid(which='minor', color='#aaa', ls=':')

                  В результате, график приобретет вид:

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

                  Создание надписей и подписей

                  • title – заголовок для осей;
                  • xlabel, ylabel – подписи для каждой из осей;
                  • text – произвольная текстовая информация в области осей;
                  • annotate – аннотация (текст с указателем).
                  • subtitle – заголовок для фигуры (окна);
                  • figtext – размещение произвольной текстовой информации в области окна.
                  fig = plt.figure(figsize=(7, 4)) ax = fig.add_subplot() plt.figtext(0.05, 0.6, 'Текст в области окна') fig.suptitle('Заголовок окна') ax.set_xlabel('Ox') ax.set_ylabel('Oy') ax.text(0.05, 0.1, 'Произвольный текст в координатных осях') ax.annotate('Аннотация', xy=(0.2, 0.4), xytext=(0.6, 0.7), arrowprops={'facecolor': 'gray', 'shrink': 0.1}) plt.show()

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

                  plt.xlabel('Ox') plt.ylabel('Oy')

                  Если же объектов Axes несколько, то эти функции будут относиться к последней активной оси.

                  Оформление текстовых элементов

                  Теперь перейдем к оформлению на уровне текстовых блоков. Как правило, все текстовые элементы в matplotlib – это объекты класса Text. И у них имеются стандартный набор свойств для их оформления. Полный их перечень можно посмотреть на странице официальной документации: https://matplotlib.org/stable/api/text_api.html Я же приведу наиболее употребительные:

                  Свойство Описание
                  alpha степень прозрачности (число в диапазоне [0; 1])
                  backgroundcolor цвет фона
                  color или c цвет текста
                  fontfamily или family тип шрифта
                  fontsize или size размер шрифта
                  fontstyle или style стиль шрифта:
                  fontweight или weight степень утолщения – число от 0 до 1000 или константы: ‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’
                  horizontalalignment или ha выравнивание по горизонтали:
                  label текст заголовка
                  position координаты текста (x, y)
                  rotation поворот текста: вещественное число [0; 1] или константы
                  verticalalignment или va выравнивание по вертикали:
                  visible отображение текста: True/False
                  x координата x – вещественное число [0; 1]
                  y координата y – вещественное число [0; 1]

                  Использовать эти свойства очень просто. Например, в функции figtext() пропишем именованный параметр fontsize:

                  plt.figtext(0.05, 0.6, 'Текст в области окна', fontsize=24)

                  Теперь текст отображается с новым размером шрифта. Или, можно еще указать цвет:

                  plt.figtext(0.05, 0.6, 'Текст в области окна', fontsize=24, color='r')

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

                  Параметр bbox

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

                  Свойство Описание
                  boxstyle вид рамки вокруг текста
                  alpha степень прозрачности фона
                  color цвет фона с рамкой
                  edgecolor или ec цвет рамки
                  facecolor или fc цвет заливки
                  fill использовать ли заливку: True/False
                  hatch тип штриховки:
                  linestyle или ls стиль линии границы:
                  linewidth или lw толщина рамки

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

                  Атрибут Описание Вид
                  circle имеет параметр pad (отступ от границы)
                  darrow имеет параметр pad
                  larrow имеет параметр pad
                  rarrow имеет параметр pad
                  round имеет параметры: pad, rounding_size
                  roundtooth имеет параметры: pad, tooth_size
                  sawtooth имеет параметры: pad, tooth_size
                  square имеет параметр pad

                  Пример использования:

                  ax.text(15, 2, 'Текст', bbox={'boxstyle':'darrow', 'facecolor': '#AAAAFF'}) ax.plot(np.arange(0, 5, 0.25))

                  Цвет фона фигуры и координатных осей

                  Используя параметр facecolor можно задавать цвет фона для всей формы и отдельно для координатных осей. Например, если при создании фигуры указать этот параметр в виде:

                  fig = plt.figure(figsize=(7, 4), facecolor='#eee')

                  то получим светло-серую заливку фона окна. Или, это можно сделать с помощью метода set() после создания фигуры:

                  fig.set(facecolor='#eee')

                  То же самое выполняется и для координатных осей, например, изменим цвет фона на светло-зеленый:

                  ax.set(facecolor='#AAFFAA')

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *