Метод plot как задать range
Перейти к содержимому

Метод plot как задать range

  • автор:

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. Работа с данными”.

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

                  Работа с графиками и простыми 2D и 3D изображениями реализована в пакете Matplotlib.

                  Использование пакета очень простое: выбираем нужный тип изображения, загружаем пример, дорабатываем, и получаем результат. Например:

                  для работы Matplotlib должен быть установлен модуль работы с массивами NumPy .

                  Прямой способ использования функциональности Matplotlib заключается в импортировании модуля PyPlot : import matplotlib.pyplot as py. Альтернативно можно использовать другое пространство имен PyLab : import pylab as py. Во втором способе также становятся доступны базовые функции пакета работы с массивами NumPy

                  import pylab as py x = range(10) y = [(float(i)/10.0*3.1415)**2 for i in range(10)] py.errorbar(x, y, yerr=range(10), capsize=3) 

                  Команды построения графиков¶

                  • один график, толщина линии – 2, линия пунктирная
                  plot(x, y, '-', lw=2) 
                  plot(x, y, '-', lw=2, x1, y1, 'o', lw=1, x2, y2, '-', ‘r’)
                  errorbar(x,y,yerr=1.,capsize=3) 
                  scatter(x, y, c=colour, s=size, alpha=0.5, edgecolors='none') 
                  py.hist(x, 50, normed=1, histtype='bar', rwidth=0.8) 
                  im = py.imshow(Z, cmap=py.cm.jet) 
                  py.figure(1) # первое окно py.subplot(211) py.plot([1,2,3]) # первый график py.subplot(212) # второй график py.plot([4,5,6]) py.figure(2) # второе окно py.plot([4,5,6]) 

                  при построении графиков x и y должны быть одинаковой размерности!

                  Задание параметров графиков¶

                  1. При вызове (см. таблицу выше)
                  2. Записать имя объекта – графика и изменять его параметры:
                  plot=plot(x, y, '-', lw=1) setp(plot, color='r', linewidth=2.0) 

                  Задание легенды¶

                  1. Cразу при построении графика
                  plot=plot(x, y, '-', lw=1, label=’graph 1’) legend() #показать легенду
                  1. Отдельной командой
                  p1, = plot([1,2,3]) p2 = plot([3,2,1]) legend([p1,p2], ["line 1","line 2"], loc=2) # присваивает и выводит легенду 
                  Место размещение легенды ¶

                  Положение Параметр loc
                  верхнее правое 1
                  верхнее левое 2
                  нижнее левое 3
                  нижнее правое 4
                  правое 5
                  левое центральное 6
                  правое центральное 7
                  внизу поцентру 8
                  вверху по центру 9
                  по центру 10

                  Параметры поля вывода графиков¶

                  • axis([0, 6, 0, 20]) – пределы графика по осям
                  • xlabel(„time (s)“) – подпись оси x
                  • ylabel(„voltage (mV)“) – подпись оси у
                  • title(„About as simple as it gets, folks“) – название графика
                  • grid(True) – показать сетку

                  Команды показа графика¶

                  ion() + draw() – показ графика в интерактивном режиме. (программа выполняется дальше)

                  show() – показ графика. Пока окно графика не закрыто программа дальше не выполняется.

                  Оглавление

                  • Построение графиков. Пакет MatPlotLib
                    • Команды построения графиков
                    • Задание параметров графиков
                    • Задание легенды
                    • Параметры поля вывода графиков
                    • Команды показа графика

                    Как установить диапазон оси (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.

                    Визуализация данных с matplotlib

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

                    Модуль matplotlib.pyplot предоставляет процедурный интерфейс к (объектно-ориентированной) библиотеке matplotlib, который во многом копирует инструменты пакета MATLAB. Инструменты модуля pyplot де-факто являются стандартным способом работы с библиотекой matplotlib , поэтому мы органичимся рассмотрением этого пакета.

                    Двумерные графики

                    pyplot.plot

                    Нарисовать графики функций sin и cos с matplotlib.pyplot можно следующим образом:

                    import numpy as np import matplotlib.pyplot as plt phi = np.linspace(0, 2.*np.pi, 100) plt.plot(phi, np.sin(phi)) plt.plot(phi, np.cos(phi)) plt.show() 

                    В результате получаем

                    ex1

                    Мы использовали функцию plot, которой передали два параметра — списки значений по горизонтальной и вертикальной осям. При последовательных вызовах функции plot графики строятся в одних осях, при этом происходит автоматическое переключение цвета.

                    fmt = '[marker][line][color]' 

                    функции plot позволяет задавать тип маркера, тип линии и цвет. Приведем несколько примеров:

                    x = np.linspace(0, 1, 100) f1 = 0.25 - (x - 0.5)**2 f2 = x**3 plt.plot(x, f1, ':b') # пунктирная синяя линия plt.plot(x, f2, '--r') # штрихованная красная линия plt.plot(x, f1+f2, 'k') # черная непрерывная линия plt.show() 

                    ex2

                    rg = np.random.Generator(np.random.PCG64()) plt.plot(rg.binomial(10, 0.3, 6), 'ob') # синие круги plt.plot(rg.poisson(7, 6), 'vr') # красные треугольники plt.plot(rg.integers(0, 10, 6), 'Dk') # черные ромбы plt.show() 

                    ex3

                    Из последнего примера видно, что если в функцию plot передать только один список y , то он будет использован для значений по вертикальной оси. В качестве значений по горизонтальной оси будет использован range(len(y)) .

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

                    • marker : str — тип маркера
                    • markersize : float — размер маркера
                    • linestyle : str — тип линии
                    • linewidth : float — толщина линии
                    • color : str — цвет

                    Полный список доступных параметров можно найти в документации.

                    pyplot.errorbar

                    Результаты измерений в физике чаще всего представлены в виде величин с ошибками. Функция plt.errorbar позволяет отображать такие данные:

                    rg = np.random.Generator(np.random.PCG64(5)) x = np.arange(6) y = rg.poisson(149, x.size) plt.errorbar(x, y, yerr=np.sqrt(y), marker='o', linestyle='none') plt.show() 

                    ex4

                    Ошибки можно задавать и для значений по горизонтальной оси:

                    rg = np.random.Generator(np.random.PCG64(5)) N = 6 x = rg.poisson(169, N) y = rg.poisson(149, N) plt.errorbar(x, y, xerr=np.sqrt(x), yerr=np.sqrt(y), marker='o', linestyle='none') plt.show() 

                    ex5

                    Ошибки измерений могут быть асимметричными. Для их отображения в качестве параметра yerr (или xerr ) необходимо передать кортеж из двух списков:

                    rg = np.random.Generator(np.random.PCG64(11)) N = 6 x = np.arange(N) y = rg.poisson(149, N) yerr = [ 0.7*np.sqrt(y), 1.2*np.sqrt(y) ] plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none') plt.show() 

                    ex6

                    Функция pyplot.errorbar поддерживает настройку отображения графика с помощью параметра fmt и всех именованных параметров, которые доступны в функции pyplot . Кроме того, здесь появляются параметры для настройки отображения линий ошибок (“усов”):

                    • ecolor : str — цвет линий ошибок
                    • elinewidth : float — ширина линий ошибок
                    • capsize : float — длина “колпачков” на концах линий ошибок
                    • capthick : float — толщина “колпачков” на концах линий ошибок

                    и некоторые другие. Изменим параметры отрисовки данных из предыдущего примера:

                    # . plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none', ecolor='k', elinewidth=0.8, capsize=4, capthick=1) plt.show() 

                    ex7

                    Настройки отображения

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

                    Диапазон значений осей

                    Задавать диапазон значений осей в matplotlib можно несколькими способами. Например, так:

                    pyplot.xlim([0, 200]) # диапазон горизонтальной оси от 0 до 200 pyplot.xlim([0, 1]) # диапазон вертикальной оси от 0 до 1 

                    Размер шрифта

                    Размер и другие свойства шрифта, который используется в matplotlib по умолчанию, можно изменить с помощью объекта matplotlib.rcParams :

                    matplotlib.rcParams.update('font.size': 14>) 

                    Объект matplotlib.rcParams хранит множество настроек, изменяя которые, можно управлять поведением по умолчанию. Смотрите подробнее в документации.

                    Подписи осей

                    Подписи к осям задаются следующим образом:

                    plt.xlabel('run number', fontsize=16) plt.ylabel(r'average current ($\mu A$)', fontsize=16) 

                    В подписях к осям (и вообще в любом тексте в matplotlib) можно использовать инструменты текстовой разметки TeX, позволяющие отрисовывать различные математические выражения. TeX-выражения должны быть внутри пары символов $ , кроме того, их следует помещать в r-строки, чтобы избежать неправильной обработки.

                    Заголовок

                    Функция pyplot.title задает заголовок диаграммы. Применим наши новые знания:

                    import numpy as np import matplotlib.pyplot as plt import matplotlib # задаем размер шрифта matplotlib.rcParams.update('font.size': 12>) rg = np.random.Generator(np.random.PCG64(11)) x = np.arange(6) y = rg.poisson(149, x.size) yerr = [ 0.7*np.sqrt(y), 1.2*np.sqrt(y) ] plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none', ecolor='k', elinewidth=0.8, capsize=4, capthick=1) # добавляем подписи к осям и заголовок диаграммы plt.xlabel('run number', fontsize=16) plt.ylabel(r'average current ($\mu A$)', fontsize=16) plt.title(r'The $\alpha^\prime$ experiment. Season 2020-2021') # задаем диапазон значений оси y plt.ylim([0, 200]) # оптимизируем поля и расположение объектов plt.tight_layout() plt.show() 

                    ex8

                    В этом примере мы использовали функцию pyplot.tight_layout, которая автоматически подбирает параметры отображения так, чтобы различные элементы не пересекались.

                    Легенда

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

                    import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams.update('font.size': 12>) x = np.linspace(0, 1, 100) f1 = 0.25 - (x - 0.5)**2 f2 = x**3 # указываем в аргументе label содержание легенды plt.plot(x, f1, ':b', label='1st component') plt.plot(x, f2, '--r', label='2nd component') plt.plot(x, f1+f2, 'k', label='total') plt.xlabel(r'$x$', fontsize=16) plt.ylabel(r'$f(x)$', fontsize=16) plt.xlim([0, 1]) plt.ylim([0, 1]) # выводим легенду plt.legend(fontsize=14) plt.tight_layout() plt.show() 

                    ex9

                    Функция pyplot.legend старается расположить легенду так, чтобы она не пересекала графики. Аргумент loc позволяет задать расположение легенды вручную. В большинстве случаев расположение по умолчанию получается удачным. Детали и описание других аргументов смотрите в документации.

                    Сетка

                    Сетка во многих случаях облегчает анализ графиков. Включить отображение сетки можно с помощью функции pyplot.grid . Аргумент axis этой функции имеет три возможных значения: x , y и both и определяет оси, вдоль которых будут проведены линии сетки. Управлять свойствами линии сетки можно с помощью именованных аргументов, которые мы рассматривали выше при обсуждении функции pyplot.plot .

                    В matplotlib поддерживается два типа сеток: основная и дополнительная. Выбор типа сетки выполняется с помощью аргумента which , который может принимать три значения: major , minor и both . По умолчанию используется основная сетка.

                    Линии сетки привязаны к отметкам на осях. Чтобы работать с дополнительной сеткой необходимо сначала включить вспомогательные отметки на осях (которые по умолчанию отключены и к которым привязаны линии дополнительной сетки) с помощью функции pyplot.minorticks_on . Приведем пример:

                    import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams.update('font.size': 12>) x = np.linspace(-1, 1, 250) plt.plot(x, x, label=r'$x$') plt.plot(x, x**2, label=r'$x^2$') plt.plot(x, x**3, label=r'$x^3$') plt.plot(x, np.cbrt(x), label=r'$x^$') plt.legend(fontsize=16) # включаем дополнительные отметки на осях plt.minorticks_on() plt.xlabel(r'$x$', fontsize=16) plt.xlim([-1., 1.]) plt.ylim([-1., 1.]) # включаем основную сетку plt.grid(which='major') # включаем дополнительную сетку plt.grid(which='minor', linestyle=':') plt.tight_layout() plt.show() 

                    ex10

                    Логарифмический масштаб

                    Функции pyplot.semilogy и pyplot.semilogx выполняют переключение между линейным и логарифмическим масштабами осей. В некоторых случаях логарифмический масштаб позволяет отобразить особенности зависимостей, которые не видны в линейном масштабе. Вот так выглядят графики экспоненциальных функций в линейном масштабе:

                    ex11

                    plt.semilogy() 

                    делает график гораздо более информативным:

                    ex12

                    Теперь мы видим поведение функций во всем динамическом диапазоне, занимающем 12 порядков.

                    Произвольные отметки на осях

                    Вернемся к первому примеру, в котором мы строили графики синуса и косинуса. Сделаем так, чтобы на горизонтальной оси отметки соответствовали различным долям числа pi и имели соответствующие подписи:

                    ex13

                    Метки на горизонтальной оси были заданы с помощью функции pyplot.xticks :

                    plt.xticks( np.linspace(-np.pi, np.pi, 9), [r'$-\pi$', r'$-3\pi/4$', r'$-\pi/2$', r'$-\pi/4$', r'$0$', r'$\pi/4$', r'$+\pi/2$', r'$3\pi/4$', r'$+\pi$']) 

                    Модуль pyplot.ticker содержит более продвинутые инструменты для управления отметками на осях. Подробности смотрите в документации.

                    Размер изображения

                    До сих пор мы строили графики в одном окне, размер которого был задан по умолчанию. За кадром matplotlib создавал объект типа Figure, который определяет размер окна и содержит все остальные элементы. Кроме того, автоматически создавался объект типа Axis. Подробнее работа с этими объектами будет рассмотрена ниже. Сейчас же мы рассмотрим функцию pyplot.figure , которая позволяет создавать новые объекты типа Figure и переключаться между уже созданными объектами.

                    Функция pyplot.figure может принимать множество аргументов. Вот основные:

                    • num : int или str — уникальный идентификатор объекта типа. Если задан новый идентификатор, то создается новый объект и он становится активным. В случае, если передан идентификатор уже существующего объекта, то этот объект возвращается и становится активным
                    • figsize : (float, float) — размер изображения в дюймах
                    • dpi : float — разрешение в количестве точек на дюйм

                    Описание других параметров функции pyplot.figure можно найти в документации. Используем эту функцию и функцию pyplot.axis чтобы улучшить наш пример с построением степенных функций:

                    ex14

                    Мы добавили две строки по сравнению с прошлой версией:

                    fig = plt.figure(figsize=(6, 6)) # . plt.axis('equal') 

                    Функция pyplot.axis позволяет задавать некоторые свойства осей. Ее вызов с параметром ‘equal’ делает одинаковыми масштабы вертикальной и горизонтальной осей, что кажется хорошей идеей в этом примере. Функция pyplot.axis возвращает кортеж из четырех значений xmin, xmax, ymin, ymax , соответствующих границам диапазонов значений осей.

                    Некоторые другие способы использования функции pyplot.axis :

                    • Кортеж из четырех float задаст новые границы диапазонов значений осей
                    • Строка ‘off’ выключит отображение линий и меток осей

                    Гистограммы

                    Обратимся теперь к другим типам диаграмм. Функция pyplot.hist строит гистограмму по набору значений:

                    import numpy as np import matplotlib.pyplot as plt rg = np.random.Generator(np.random.PCG64(5)) data = rg.poisson(145, 10000) plt.hist(data, bins=40) # для краткости мы опускаем код для настройки осей, сетки и т.д. 

                    ex15

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

                    Некоторые другие аргументы функции pyplot.hist :

                    • range : (float, float) — диапазон значений, в котором строится гистограмма. Значения за пределами заданного диапазона игнорируются.
                    • density : bool . При значении True будет построена гистограмма, соответствующая плотности вероятности, так что площадь гистограммы будет равна единице.
                    • weights : список float значений того же размера, что и набор данных. Определяет вес каждого значения при построении гистограммы.
                    • histtype : str . может принимать значения . Определяет тип отрисовки гистограммы.

                    В качестве первого аргумента можно передать кортеж наборов значений. Для каждого из них будет построена гистограмма. Аргумент stacked со значением True позволяет строить сумму гистограмм для кортежа наборов. Покажем несколько примеров:

                    ex18

                    rg = np.random.Generator(np.random.PCG64(5)) data1 = rg.poisson(145, 10000) data2 = rg.poisson(140, 2000) # левая гистограмма plt.hist([data1, data2], bins=40) # центральная гистограмма plt.hist([data1, data2], bins=40, histtype='step') # правая гистограмма plt.hist([data1, data2], bins=40, stacked=True) 

                    В физике гистограммы часто представляют в виде набора значений с ошибками, предполагая при этом, что количество событий в каждом бине является случайной величиной, подчиняющейся биномиальному распределению. В пределе больших значений флуктуации количества событий в бине могут быть описаны распределением Пуассона, так что характерная величина флуктуации определяется корнем из числа событий. Библиотека matplotlib не имеет инструмента для такого представления данных, однако его легко получить с помощью комбинации numpy.histogram и pyplot.errorbar :

                    def poisson_hist(data, bins=60, lims=None): """ Гистограмма в виде набора значений с ошибками """ hist, bins = np.histogram(data, bins=bins, range=lims) bins = 0.5 * (bins[1:] + bins[:-1]) return (bins, hist, np.sqrt(hist)) rg = np.random.Generator(np.random.PCG64(5)) data = rg.poisson(145, 10000) x, y, yerr = poisson_hist(data, bins=40, lims=(100, 190)) plt.errorbar(x, y, yerr=yerr, marker='o', markersize=4, linestyle='none', ecolor='k', elinewidth=0.8, capsize=3, capthick=1) 

                    ex19

                    Диаграммы рассеяния

                    Распределение событий по двум измерениям удобно визуализировать с помощью диаграммы рассеяния:

                    rg = np.random.Generator(np.random.PCG64(5)) means = (0.5, 0.9) covar = [ [1., 0.6], [0.6, 1.] ] data = rg.multivariate_normal(means, covar, 5000) plt.scatter(data[:,0], data[:,1], marker='o', s=1) 

                    ex20

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

                    rg = np.random.Generator(np.random.PCG64(4)) data = rg.uniform(-1, 1, (50, 2)) col = np.arctan2(data[:, 1], data[:, 0]) size = 100*np.sum(data**2, axis=1) plt.scatter(data[:,0], data[:,1], marker='o', s=size, c=col) 

                    ex21

                    Цветовую палитру можно задать с помощью аргумента cmap . Подробности и описание других аргументов функции pyplot.scatter можно найти в документации.

                    Контурные диаграммы

                    Контурные диаграммы позволяют визуализировать функции двух переменных:

                    from scipy import stats means = (0.5, 0.9) covar = [ [1., 0.6], [0.6, 1.] ] mvn = stats.multivariate_normal(means, covar) x, y = np.meshgrid( np.linspace(-3, 3, 80), np.linspace(-2, 4, 80) ) data = np.dstack((x, y)) # левая диаграмма — без заливки цветом plt.contour(x, y, mvn.pdf(data), levels=10) # правая диаграмма — с заливкой цветом plt.contourf(x, y, mvn.pdf(data), levels=10) 

                    ex22

                    Аргумент levels задает количество контуров. По умолчанию контуры отрисовываются равномерно между максимальным и минимальным значениями. В аргумент levels также можно передать список уровней, на которых следует провести контуры.

                    Обратите внимание на использование функций numpy.meshgrid и numpy.dstack в этом примере.

                    Контурную диаграмму можно дополнить цветовой полосой colorbar , вызвав функцию pyplot.colorbar :

                    cs = plt.contourf(x, y, mvn.pdf(data), levels=15, cmap=matplotlib.cm.magma_r) cbar = plt.colorbar(cs) 

                    ex23

                    Более подробное описание функций plt.contour и plt.contourf смотрите в документации.

                    Расположение нескольких осей в одном окне

                    В одном окне (объекте Figure ) можно разместить несколько осей (объектов axis.Axis ). Функция pyplot.subplots создает объект Figure , содержащий регулярную сетку объектов axis.Axis :

                    import numpy as np from scipy import stats import matplotlib.pyplot as plt fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(12, 8)) x = np.linspace(0.01, 25, 250) for idx, row in enumerate(axes): for jdx, ax in enumerate(row): ndf = idx * 3 + jdx + 1 y = stats.chi2.pdf(x, ndf) ax.plot(x, y, label=fr'$\chi^2_ndf>>>(x)$') ax.set_xlabel(r'$x$', fontsize=16) ax.set_ylim([0, 1.05*y.max()]) ax.minorticks_on() ax.legend(fontsize=16) ax.grid(which='major') ax.grid(which='minor', linestyle=':') fig.tight_layout() plt.show() 

                    ex24

                    Количество строк и столбцов, по которым располагаются различные оси, задаются с помощью параметров nrows и ncols , соответственно. Функция pyplot.subplots возвращает объект Figure и двумерный список осей axis.Axis . Обратите внимание на то, что вместо вызовов функций модуля pyplot в этом примере использовались вызовы методов классов Figure и axis.Axis .

                    В последнем примере горизонтальная ось во всех графиках имеет один и тот же диапазон. Аргумент sharex функции pyplot.subplots позволяет убрать дублирование отрисовки осей в таких случаях:

                    fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(12, 8), sharex=True) # . for idx, row in enumerate(axes): for jdx, ax in enumerate(row): # . if idx: ax.set_xlabel(r'$x$', fontsize=16) 

                    ex25

                    Существует аналогичный параметр sharey для вертикальной оси.

                    Более гибкие возможности регулярного расположения осей предоставляет функция pyplot.subplot. Мы не будем рассматривать эту функцию и ограничимся лишь ее упоминанием.

                    Функция pyplot.axes позволяет добавлять новые оси в текущем окне в произвольном месте:

                    import numpy as np import matplotlib.pyplot as plt exno = 26 rg = np.random.Generator(np.random.PCG64(5)) x1 = rg.exponential(10, 5000) x2 = rg.normal(10, 0.1, 100) # Строим основную гистограмму plt.hist([x1, x2], bins=150, range=(0, 60), stacked=True) plt.minorticks_on() plt.xlim((0, 60)) plt.grid(which='major') plt.grid(which='minor', linestyle=':') # Строим вторую гистограмму в отдельных осях plt.axes([.5, .5, .4, .4]) plt.hist([x1, x2], bins=100, stacked=True, range=(9, 11)) plt.grid(which='major') plt.tight_layout() # сохраняем диаграмму в файл plt.savefig('histograms.png') plt.show() 

                    ex26

                    В этом примере была использована функция pyplot.savefig , сохраняющая содержимое текущего окна в файл в векторном или растровом формате. Формат задается с помощью аргумента format или автоматически определяется из имени файла (как в примере выше). Набор доступных форматов зависит от окружения, однако в большинстве случаев можно использовать такие форматы как png , jpeg , pdf , svg и eps .

                    Резюме

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

                    • функции для построения диаграмм pyplot.plot , pyplot.errorbar . pyplot.hist , pyplot.scatter , pyplot.contour и pyplot.contourf ;
                    • средства настройки свойств линий и маркеров;
                    • средства настройки координатных осей: подписи, размер шрифта, координатная сетка, произвольные метки др.;
                    • инструмены для расположения нескольких координатных осей в одном окне.

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

                    Источники

                    • matplotlib.pyplot
                    • Pyplot tutorial
                    • Colormaps
                    • Scipy Lecture Notes

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

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