Размещаем стандартные текстовые элементы на графике
На одном из прошлых занятий мы увидели, как можно строить двумерные линейные графики с помощью функции plot() и задавать различные стили его отображения: цвет, тип, толщину линии. На этом занятии продолжим тему оформления графиков и начнем с сетки. Как мы уже говорили, в самом простом случае достаточно вызвать команду grid():
И сетка появится сформируется в текущих координатных осях:
Причем, ее размеры будут автоматически подстраиваться под размер осей (объекта Axes).
Помимо обычной крупной сетки (major grid) можно наложить более мелкую (minor grid) минорную сетку. Для этого сначала нужно включить режим отображения минорной сетки:
А, затем, в функции grid() прописать два типа сеток (мажорную и минорную):
В результате, график приобретет вид:
Однако, здесь следует иметь в виду, что такая мелкая сетка заметно снижает производительность при отображении графиков. Поэтому без особой необходимости ее лучше не использовать.
Создание надписей и подписей
Давайте в качестве примера посмотрим, как работают все эти элементы на графике:
Обратите внимание, если у нас используется всего одна координатная ось, то подписи для нее можно определить с помощью функций:
Если же объектов Axes несколько, то эти функции будут относиться к последней активной оси.
Оформление текстовых элементов
Теперь перейдем к оформлению на уровне текстовых блоков. Как правило, все текстовые элементы в matplotlib – это объекты класса Text. И у них имеются стандартный набор свойств для их оформления. Полный их перечень можно посмотреть на странице официальной документации:
Я же приведу наиболее употребительные:
степень прозрачности (число в диапазоне [0; 1])
fontfamily или family
fontstyle или style
fontweight или weight
степень утолщения – число от 0 до 1000 или константы: ‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’
horizontalalignment или ha
выравнивание по горизонтали:
координаты текста (x, y)
поворот текста: вещественное число [0; 1] или константы
verticalalignment или va
выравнивание по вертикали:
отображение текста: True/False
координата x – вещественное число [0; 1]
координата y – вещественное число [0; 1]
Использовать эти свойства очень просто. Например, в функции figtext() пропишем именованный параметр fontsize:
Теперь текст отображается с новым размером шрифта. Или, можно еще указать цвет:
Получим текст размером 24 и красным цветом. По аналогии задаются все другие свойства.
Также следует иметь в виду, что у каждого типа текстовых объектов имеются и свои дополнительные свойства. Подробно о них можно посмотреть в документации.
Параметр bbox
С помощью параметра bbox можно устанавливать дополнительные элементы оформления для текстовых блоков. Ему следует указать словарь, ключами которого являются аргументы класса FancyBboxPatch:
вид рамки вокруг текста
степень прозрачности фона
цвет фона с рамкой
использовать ли заливку: True/False
стиль линии границы:
В качестве параметра boxstyle можно выбирать следующие значения:
имеет параметр pad (отступ от границы)
имеет параметр pad
имеет параметр pad
имеет параметр pad
имеет параметры: pad, rounding_size
имеет параметры: pad, tooth_size
имеет параметры: pad, tooth_size
имеет параметр pad
Цвет фона фигуры и координатных осей
Используя параметр facecolor можно задавать цвет фона для всей формы и отдельно для координатных осей. Например, если при создании фигуры указать этот параметр в виде:
то получим светло-серую заливку фона окна. Или, это можно сделать с помощью метода set() после создания фигуры:
То же самое выполняется и для координатных осей, например, изменим цвет фона на светло-зеленый:
На этом мы завершим знакомство с типовыми элементами оформления графиков. На следующем продолжим эту тему и поговорим об отображении легенды – краткой информации по каждому графику и возможности рисования стандартных геометрических фигур.
Видео по теме
#1. Установка пакета и основные возможности
#2. Функция plot для построения и оформления двумерных графиков
#3. Отображение нескольких координатных осей в одном окне
#4. Граничные значения осей и локаторы для расположения меток на них
#5. Настраиваем формат отображения меток у координатных осей
#6. Делаем логарифмический масштаб у координатных осей
#7. Размещаем стандартные текстовые элементы на графике
#8. Добавляем легенду и рисуем геометрические фигуры на графиках
#9. Рисуем ступенчатые, стековые, stem и точечные графики
#10. Рисуем гистограммы, столбчатые и круговые диаграммы
#11. Показ изображений и цветовых сеток
#12. Как строить трехмерные графики
#13. Рисуем линии уровня функциями contour, contourf и tricontour, tricontourf
#14. Создаем анимацию графиков Классы FuncAnimation и ArtistAnimation
Matplotlib. Урок 3.3. Настройка графиков. Текстовые элементы графика
В этом уроке будут подробно рассмотрены текстовые элементы графика, такие как заголовок подложки и поля графика, подписи осей, текстовые блоки и аннотации.
Текстовые элементы графика
В части текстового наполнения при построении графика выделяют следующие составляющие:
Ниже представлен код, отображающий все указанные выше текстовые элементы.
Заголовок фигуры и поля графика
Функция title() также поддерживает в качестве аргументов свойства класса Text :
Подписи осей графика
Основные аргументы функций почти полностью совпадают с теми, что были описаны в функции title() :
В самом простом случае достаточно передать только подпись в виде строки:
Используемые некоторые из дополнительных свойств для настройки внешнего вида подписей осей:
Текстовый блок
В простейшем варианте использование text() будет выглядеть так:
Аннотация
Инструмент Аннотация позволяет установить текстовый блок с заданным содержанием и стрелкой для конкретного места на графике. Аннотация – это мощный инструмент, остановимся на нем более подробно.
Ниже представлен пример кода, который демонстрирует простой вариант использования annotation() :
Параметрам 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’
Тип координатной системы: полярная. Работа ведется в пространстве поля графика.
Стиль стрелки
Тип: str, ArrowStyle, optional
Доступные стили стрелок представлены в таблице и на рисунке ниже.
Первый урок из цикла, посвященному библиотеке для визуализации данных Matplotlib. В рамках данного урока будут рассмотрены такие вопросы как: установка библиотеки, построение линейного графика, несколько графиков на одном и на разных полях, построение диаграммы для категориальных данных и обзор основных элементов графика.
Установка
Варианты установки Matplotlib
Установка Matplotlib через менеджер pip
Второй вариант – это воспользоваться менеджером pip и установить Matplotlib самостоятельно, для этого введите в командной строке вашей операционной системы следующие команды:
Проверка установки
Для проверки того, что все у вас установилось правильно, запустите интерпретатор Python и введите в нем следующее:
После этого можете проверить версию библиотеки (она скорее всего будет отличаться от приведенной ниже):
Быстрый старт
Если вы работаете в Jupyter Notebook для того, чтобы получать графики рядом с ячейками с кодом необходимо выполнить специальную magic команду после того, как импортируете matplotlib ::
Результат работы выглядеть будет так, как показано на рисунке ниже.
Пример, аналогичный тому, что представлен на рисунке выше, для отдельного Python файла будет выглядеть так:
В результате получите график в отдельном окне.
Далее мы не будем останавливаться на особенностях использования magic команды, просто запомните, если вы используете Jupyter notebook при работе с Matplotlib вам обязательно нужно включить %matplotlib inline.
Построение графика
Для начал построим простую линейную зависимость, дадим нашему графику название, подпишем оси и отобразим сетку. Код программы:
В результате получим следующий график:
Несколько графиков на одном поле
Построим несколько графиков на одном поле, для этого добавим квадратичную зависимость:
В приведенном примере в функцию plot() последовательно передаются два массива для построения первого графика и два массива для построения второго, при этом, как вы можете заметить, для обоих графиков массив значений независимой переменной x один и то же.
Несколько разделенных полей с графиками
Третья, довольно часто встречающаяся задача – это отобразить два или более различных поля, на которых будет отображено по одному или более графику.
Построим уже известные нам две зависимость на разных полях.
Здесь мы воспользовались новыми функциями:
figure() – функция для задания глобальных параметров отображения графиков. В нее, в качестве аргумента, мы передаем кортеж, определяющий размер общего поля.
subplot() – функция для задания местоположения поля с графиком. Существует несколько способов задания областей для вывода через функцию subplot() мы воспользовались следующим: первый аргумент – количество строк, второй – столбцов в формируемом поле, третий – индекс (номер поля, считаем сверху вниз, слева направо).
Построение диаграммы для категориальных данных
До этого мы строили графики по численным данным, т.е. зависимая и независимая переменные имели числовой тип. На практике довольно часто приходится работать с данными нечисловой природы – имена людей, название фруктов, и т.п.
Построим диаграмму на которой будет отображаться количество фруктов в магазине:
К этому моменту, если вы самостоятельно попробовали запустить приведенные выше примеры, у вас уже должно сформировать некоторое понимание того, как осуществляется работа с этой библиотекой.
Основные элементы графика
Корневым элементом при построения графиков в системе Matplotlib является Фигура ( Figure ). Все, что нарисовано на рисунке выше является элементами фигуры. Рассмотрим ее составляющие более подробно.
На рисунке представлены два графика – линейный и точечный. Matplotlib предоставляет огромное количество различных настроек, которые можно использовать для того, чтобы придать графику вид, который вам нужен: цвет, толщина и тип линии, стиль линии и многое другое, все это мы рассмотрим в ближайших статьях.
Вторым, после непосредственно самого графика, по важности элементом фигуры являются оси. Для каждой оси можно задать метку (подпись), основные ( major ) и дополнительные ( minor ) тики, их подписи, размер и толщину, также можно задать диапазоны по каждой из осей.
Следующими элементами фигуры, которые значительно повышают информативность графика являются сетка и легенда. Сетка также может быть основной ( major ) и дополнительной ( minor ). Каждому типу сетки можно задавать цвет, толщину линии и тип. Для отображения сетки и легенды используются соответствующие команды.
Ниже представлен код, с помощью которого была построена фигура, изображенная на рисунке:
Если в данный момент вам многое кажется непонятным – не переживайте, далее мы разберем подробно особенности настройки и использования всех элементов представленных на поле с графиками.
pyplot является зависимым от состояния ( stateful ). Он отслеживает статус объекта Figure и его области построения. Функции выполняются на текущем объекте.
Простой интерактивный график
Для знакомства с библиотекой matplotlib и с самим pyplot начнем создавать простой интерактивный график. В matplotlib эта операция выполняется очень просто. Достаточно трех строчек кода.
В Python конструкторы обычно не нужны. Все определяется неявно. Так, при импорте пакета уже создается экземпляр plt со всеми его графическими возможностями, который готов к работе. Нужно всего лишь использовать функцию plot() для передачи функций, по которым требуется построить график.
Поэтому достаточно передать значения, которые нужно представить в виде последовательности целых чисел.
Результат должен соответствовать показанному на изображении. Он будет отображаться в окне, которое называется plotting window с панелью инструментов. Прямо как в MATLAB.
Окно графика
В этом окне есть панель управления, состоящая из нескольких кнопок.
Код в консоли IPython передается в консоль Python в виде набора команд:
Если функции plt.plot() передать только список или массив чисел, matplotlib предположит, что это последовательность значений y на графике и свяжет ее с последовательностью натуральных чисел x: 0, 1, 2, 3, ….
Свойства графика
На последнем изображении точки были представлены синей линией. Если не указывать явно, то график возьмет настройку функции plt.plot() по умолчанию:
Для получения настоящего графика, где каждая пара значений ( x, y ) будет представлена в виде красной точки, нужно поменять это представление.
Если же вы используете Jupyter QtConsole, то для каждой введенной команды будет появляться новый график.
в будущем в примерах средой разработки будет выступать IPython QtConsole.
в IPython QtConsole для создания графика иногда нужно ввести несколько строк команд. Чтобы график при этом не генерировался с каждым нажатием Enter (перевод на новую строку), необходимо нажимать Ctrl + Enter. А когда график будет готов, остается лишь нажать Enter дважды.
На следующем изображении видно, как новые настройки делают график более читаемым. Так, конечные точки набора данных теперь распределены по графику, а не находятся на краях. А сверху есть заголовок.
matplotlib и NumPy
Даже matplot, которая является полностью графической библиотекой, основана на NumPy. Вы видели на примерах, как передавать списки в качестве аргументов. Это нужно как для представления данных, так и для того, чтобы задавать границы осей. Внутри эти списки конвертируются в массивы NumPy.
Таким образом можно прямо добавлять в качестве входящих данных массивы NumPy. Массив данных, обработанный pandas, может быть использован matplotlib без дальнейшей обработки.
Как видно на прошлом изображении, график представляет три разных тренда с помощью разных цветов и меток. В таких случаях когда тренд функции очевиден, график является не самой подходящим представлением — лучше использовать линии. Чтобы разделить их не только цветами, можно использовать паттерны, состоящие из комбинаций точек и дефисов.
если вы не пользуетесь IPython QtConsole со встроенной matplotlib или работаете с этим кодом в обычной сессии Python, используйте команду plt.show() в конце кода для получения объекта графика со следующего изображения.
Использование kwargs
В качестве примера с помощью аргумента linewidth можно поменять толщину линии.
Работа с несколькими объектами Figure и осями
До сих пор во всех примерах команды pyplot были направлены на отображение в пределах одного объекта. Но matplotlib позволяет управлять несколькими Figure одновременно, а внутри одного объекта можно выводить подграфики.
Работая с pyplot, нужно помнить о концепции текущего объекта Figure и текущих осей (графика на объекте).
Дальше будут отображаться тренды синусоиды (синус и косинус), и лучше всего разделить полотно по вертикали на два горизонтальных подграфика. В график передают числа 211 и 212.
Теперь — то же самое для двух вертикальных подграфиков. Передаем в качестве аргументов 121 и 122.
Добавление элементов на график
Чтобы сделать график более информативным, недостаточно просто представлять данные с помощью линий и маркеров и присваивать диапазон значений с помощью двух осей. Есть и множество других элементов, которые можно добавить на график, чтобы наполнить его дополнительной информацией.
В этом разделе добавим на график текстовые блоки, легенду и так далее.
Добавление текста
количество команд для представления графика постоянно растет. Но их не нужно переписывать каждый раз. Достаточно использовать стрелки на клавиатуре, вызывая раннее введенные команды и редактируя их с помощью новых строк (в тексте они выделены жирным).
Теперь добавим две метки на график. Они будут описывать тип значений на каждой из осей.
Благодаря ключевым словам можно менять характеристики текста. Например, можно поменять заголовок, выбрав другой шрифт и увеличив его размер. Также можно менять цвета меток осей, чтобы акцентировать внимание на заголовке всего графика.
Первые два аргумента — это координаты, в которых нужно разметить текст. s — это строка с текстом, а fontdict (опционально) — желаемый шрифт. Разрешается использовать и ключевые слова.
Добавим метку для каждой точки графика. Поскольку первые два аргумента в функции являются координатами, координаты всех точек по оси y немного сдвинутся.
Теперь у каждой точки есть своя метка.
Поскольку matplotlib — это графическая библиотека, созданная для использования в научных кругах, она должна быть способна в полной мере использовать научный язык, включая математические выражения. matplotlib предоставляет возможность интегрировать выражения LaTeX, что позволяет добавлять выражения прямо на график.
Также разрешается использовать ключевые слова, чтобы дополнить текст графика. Например, можно добавить формулу, описывающую тренд и цветную рамку.
Добавление сетки
Также на график можно добавить сетку. Часто это необходимо, чтобы лучше понимать положение каждой точки на графике.
Добавление легенды
Также на графике должна присутствовать легенда. pyplot предлагает функцию legend() для добавления этого элемента.
В функцию нужно передать строку, которая будет отображаться в легенде. В этом примере текст First series характеризует входящий массив данных.
По умолчанию легенда добавляется в правом верхнем углу. Чтобы поменять это поведение, нужно использовать несколько аргументов-ключевых слов. Так, для выбора положения достаточно передать аргумент loc со значением от 0 до 10. Каждая из цифр обозначает один из углов. Значение 1 — значение по умолчанию, то есть, верхний правый угол. В следующем примере переместим легенду в левый верхний угол, чтобы она не пересекалась с точками на графике.
Код положения
Положение
0
лучшее
1
Верхний правый угол
2
Верхний левый угол
3
Нижний левый угол
4
Нижний правый угол
5
Справа
6
Слева по центру
7
Справа по центру
8
Снизу по центру
9
Сверху по центру
10
По центру
Сохранение графиков
В этом разделе разберемся, как сохранять график разными способами. Если в будущем потребуется использовать график в разных Notebook или сессиях Python, то лучший способ — сохранять графики в виде кода Python. С другой стороны, если они нужны в отчетах или презентациях, то подойдет сохранение в виде изображения. Можно даже сохранить график в виде HTML-страницы, что пригодится при работе в интернете.
Сохранение кода
В этом примере сохранить весь код, отвечающий за формирование графика, можно с помощью ввода со строки 171.
После запуска команды файл my_first_chart.py окажется в рабочей директории.
Позже, когда вы откроете сессию IPython, у вас уже будет готовый график и его можно редактировать с момента сохранения этой командой:
в определенных случаях последняя команда будет работать только после ввода двух предыдущих.
Сохранение сессии в HTML-файл
С помощью IPython QtConsole вы можете конвертировать весь код и графику, представленные в текущей сессии, в одну HTML-страницу. Просто выберите File → Save to HTML/XHTML в верхнем меню.
Будет предложено сохранить сессию в одном из двух форматов: HTML и XHTML. Разница между ними заключается в типе сжатия изображения. Если выбрать HTML, то все картинки конвертируются в PNG. В случае с XHTML будет выбран формат SVG.
Сохранение графика в виде изображения
Файл появится в рабочей директории. Он будет называться my_chart.png и включать изображение графика.
Обработка значений дат
Одна из основных проблем при анализе данных — обработка значений дат. Отображение даты по оси (обычно это ось x ) часто становится проблемой.
Возьмем в качестве примера линейный график с набором данных, который включает 8 точек, где каждая представляет точку даты на оси x в следующем формате: день-месяц-год.
Автоматическая расстановка отметок в этом случае — настоящая катастрофа. Даты сложно читать, ведь между ними нет интервалов, и они наслаиваются друг на друга.
Задав все эти изменения, можно получить график как на следующем изображении.