Использование библиотеки Matplotlib. Как выводить текст и настраивать его внешний вид | jenyay.net

Использование библиотеки Matplotlib. Как выводить текст и настраивать его внешний вид

Содержание

Параметры функции text()

В библиотеке matplotlib для того, чтобы добавить текстовую надпись на график используется очень простая функция text() из модуля matplotlib.pyplot. Коротко рассмотрим её параметры.

text(x, y, s, fontdict=None, withdash=False, **kwargs)

Здесь

  • x, y задают координаты выводимого текста. При этом координаты задаются в системе координат осей. То есть координата x=0, y=0 соответствует точке пересечения осей X и Y. Систему координат можно изменять, но об этом я напишу как-нибудь в другой раз.
  • s - выводимая строка.
  • fontdict - словарь, описывающий шрифт, с помощью которого будет выведена надпись.
  • withdash - булево значение, равное False, если нужно вывести простой текст, и True, если нужно вывести текст с линией, которую можно использовать, например, для указания каких-то точек на графике.
  • С помощью необязательных именованных параметров **kwargs можно задавать оформление текста, его выравнивание и некоторые другие параметры. Полный список возможных параметров можно найти в документации, а в этой статье будут рассмотрены только те параметры, которые непосредственно касаются оформления текста (шрифт, цвет, рамка и т.п.): family, size, style, weight, color, backgroundcolor, alpha, bbox и rotation.

Простой вывод текста

Для начала выведем рядом с графиком текст с оформлением по умолчанию.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text(0.1, 1.1, 'Функция sinc')

    plt.show()

В качестве выводимой функции используется sinc(). Чтобы не усложнять пример объявлением этой функции, используется библиотека numpy, где эта функция уже есть. Если вы используете matplotlib, то наверняка знаете об этой библиотеке.

В результате выполнения этого скрипта будет выведено следующее окно:

Задание шрифта. Параметр family

Для того, чтобы поменять шрифт, которым будет выведен текст, используется именованный параметр family (в качестве альтернативы можно использовать параметры fontfamily, fontname или name). Этот параметр может принимать следующие строковые значения: "serif", "sans-serif", "cursive", "fantasy", "monospace" или название шрифта.

Использование параметра family показано в следующем примере.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'Default font')
    plt.text (0.4, 1.0, 'family="sans-serif"', family='sans-serif')
    plt.text (0.7, 0.9, 'family="serif"', family='serif')
    plt.text (1.0, 0.8, 'family="fantasy"', family='fantasy')
    plt.text (1.3, 0.7, 'family="monospace"', family='monospace')
    plt.text (1.6, 0.6, 'family="cursive"', family='cursive')

    # Задание шрифта по имени
    plt.text (1.9, 0.5, 'family="Courier New"', family='Courier New')

    plt.show()

В результате будет показано следующее окно:

Того же самого эффекта можно добиться, используя параметр fontdict:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'Default font')
    plt.text (0.4, 1.0, 'family="sans-serif"', fontdict={'family': 'sans-serif'})
    plt.text (0.7, 0.9, 'family="serif"', fontdict={'family': 'serif'})
    plt.text (1.0, 0.8, 'family="fantasy"', fontdict={'family': 'fantasy'})
    plt.text (1.3, 0.7, 'family="monospace"', fontdict={'family': 'monospace'})
    plt.text (1.6, 0.6, 'family="cursive"', fontdict={'family': 'cursive'})

    # Задание шрифта по имени
    plt.text (1.9, 0.5, 'family="Courier New"', fontdict={'family': 'Courier New'})

    plt.show()

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

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.rc('font', **{'family': 'Courier New'})
    plt.text(0.1, 1.1, 'Функция sinc')

    plt.show()

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

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

Изменение размера шрифта. Параметр size

Для изменения размера шрифта используется именованный параметр size. Этот параметр может принимать в качестве значения строки "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large" или число, задающее размер шрифта. Возможные варианты параметра size показаны в следующем примере.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'size="xx-small"', size='x-small')
    plt.text (0.3, 1.02, 'size="x-small"', size='x-small')
    plt.text (0.5, 0.94, 'size="small"', size='small')
    plt.text (0.7, 0.86, 'size="medium"', size='medium')
    plt.text (0.9, 0.78, 'size="large"', size='large')
    plt.text (1.1, 0.70, 'size="x-large"', size='x-large')
    plt.text (1.2, 0.58, 'size="xx-large"', size='xx-large')
    plt.text (1.3, 0.4, 'size=30', size=30)

    plt.show()

Использование наклонного шрифта. Параметр style

Для того, чтобы сделать шрифт наклонным, используется именованный параметр style, который может принимать одно из трех строковых значений: "normal" для использования обычного не наклонного шрифта, "italic" или "oblique". Разницы между последними двумя вариантами я не заметил. Возможно, не для всех шрифтов можно установить разный наклон.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'style="normal"', style='normal')
    plt.text (0.3, 1.02, 'style="italic"', style='italic')
    plt.text (0.5, 0.94, 'style="oblique"', style='oblique')

    plt.show()

Задание толщины шрифта. Параметр weight

Именованный параметр weight, как и параметр size, может принимать либо строковые значения для использования одного из предустановленного размера толщины шрифта, либо целочисленное значение в диапазоне от 0 до 1000. В последнем случае 0 обозначает самый тонкий шрифт, 1000 - самый жирный. Возможные значения параметра weight следующие (в порядке возрастания жирности): "ultralight", "light", "normal", "regular", "book", "medium", "roman", "semibold", "demibold", "demi", "bold", "heavy", "extra bold", "black". Не для каждого шрифта можно установить столько уровней жирности, что видно из следующего примера.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'weight="ultralight"', weight='ultralight')
    plt.text (0.3, 1.02, 'weight="light"', weight='light')
    plt.text (0.5, 0.94, 'weight="normal"', weight='normal')
    plt.text (0.7, 0.86, 'weight="regular"', weight='regular')
    plt.text (0.9, 0.78, 'weight="book"', weight='book')
    plt.text (1.1, 0.70, 'weight="medium"', weight='medium')
    plt.text (1.2, 0.62, 'weight="roman"', weight='roman')
    plt.text (1.3, 0.54, 'weight="semibold"', weight='semibold')
    plt.text (1.4, 0.46, 'weight="demibold"', weight='demibold')
    plt.text (1.5, 0.38, 'weight="demi"', weight='demi')
    plt.text (1.6, 0.30, 'weight="bold"', weight='bold')
    plt.text (1.7, 0.22, 'weight="heavy"', weight='heavy')
    plt.text (1.8, 0.16, 'weight="extra bold"', weight='extra bold')
    plt.text (1.9, 0.08, 'weight="black"', weight='black')
    plt.text (2.0, -0.16, 'weight=200', weight=200)

    plt.show()

Задание цвета шрифта. Параметр color

С помощью именованного параметра color можно задавать цвет, которым будет выведена надпись. Напомню, что цвет в библиотеке matplotlib может задаваться несколькими способами (более подробно о способах задания цвета читайте в статье Способы задания цвета в Matplotlib):

  • С помощью строки, задающей название цвета, например, color="blue".
  • С помощью строки, задающей название цвета в сокращенном виде, например, color="r".
  • С помощью строки, задающей цвет в том виде, как это принято в HTML, например, color="#11aa55".
  • С помощью кортежа, задающего цвет в формате (R, G, B), например, color=(0.4, 0.5, 0.3).
  • Серый цвет можно задавать с помощью строки, задающей "светлость" серого цвета в интервале от 0 (черный цвет) до 1 (белый цвет) например, color="0.7".

Возможные способы задания цвета демонстрирует следующий пример.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'color="blue"', color='blue')
    plt.text (0.4, 1.0, 'color="r"', color='r')
    plt.text (0.7, 0.9, 'color="#11aa55"', color='#11aa55')
    plt.text (1.0, 0.8, 'color=(0.4, 0.5, 0.3)', color=(0.4, 0.5, 0.3))
    plt.text (1.3, 0.7, 'color="0.7"', color='0.7')

    plt.show()

Задание цвета фона надписи. Параметр backgroundcolor

Аналогично параметру color работает именованный параметр backgroundcolor, который задает цвет фона надписи, что демонстрирует следующий пример.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'backgroundcolor="yellow"', backgroundcolor='yellow')
    plt.text (0.4, 0.9, 'backgroundcolor="r"', backgroundcolor='r')
    plt.text (0.7, 0.7, 'backgroundcolor="#11aa55"', backgroundcolor='#11aa55')
    plt.text (1.0, 0.5, 'backgroundcolor=(0.4, 0.5, 0.3)', backgroundcolor=(0.4, 0.5, 0.3))
    plt.text (1.3, 0.3, 'backgroundcolor="0.7"', backgroundcolor='0.7')

    plt.show()

Задание прозрачности надписи. Параметр alpha

Именованный параметр alpha задает прозрачность надписи. Значение должно лежать в интервале от 0 (полностью прозрачный текст) до 1 (полностью непрозрачный текст).

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (1.5, 1.1, 'Transparent text. alpha = 0.1', alpha=0.1)
    plt.text (1.5, 1.02, 'Transparent text. alpha = 0.3', alpha=0.3)
    plt.text (1.5, 0.94, 'Transparent text. alpha = 0.5', alpha=0.5)
    plt.text (1.5, 0.86, 'Transparent text. alpha = 0.7', alpha=0.7)
    plt.text (1.5, 0.78, 'Transparent text. alpha = 0.9', alpha=0.9)

    plt.show()

Поворот текста. Параметр rotation

Для того, чтобы вывести текст, повернутый на определенный угол, используется именованный параметр rotation, который может принимать либо целочисленное значение угла (дробная часть угла отбрасывается), либо одно из возможных строковых значений: "horizontal" для вывода текста горизонтально, "vertical" для вывода текста вертикально.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text (0.1, 1.1, 'rotation="horizontal"', rotation='horizontal')
    plt.text (4.0, 0.35, 'rotation=45', rotation=45)
    plt.text (1.5, 0.35, 'rotation="vertical"', rotation='vertical')

    plt.show()

Задание рамки вокруг текста. Параметр bbox

Именованный параметр bbox предназначен для рисования рамки вокруг текста. В качестве значения аргумента bbox должен быть словарь, описывающий отображаемую рамку. В этом словаре ключ обозначает параметр рамки, а значение - значение соответствующего параметра.

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

  • Ключ facecolor. Значение, которое задает цвет заливки внутри рамки. Возможное значение - строка, описывающая цвет. Способы задания цвета были перечислены в разделе про параметр color
  • Ключ edgecolor. Значение, которое задает цвет линий рамки.
  • Ключ fill. Булево значение, которое определяет, нужно ли закрашивать фон внутри рамки.
  • Ключ linestyle (или ls). Строковое значение, которое задает стиль линий рамки. Возможные значения: "solid" (обычная рамка), "dashed" (штриховой пунктир), "dashdot" (штрихпунктир), "dotted" (точечный пунктир).
  • Ключ linewidth (или lw). Значение дробное или None. Задает толщину линии рамки.
  • Ключ hatch. Строковое значение, которое задает штриховку внутри рамки. Возможные значения: "/", "\", "|", "-", "+", "x", "o", "O", "." или "*".
  • Ключ visible. Булево значение, которое определяет, должна ли рамка быть видимой.
  • Ключ boxstyle. Строковое значение, которое задает внешний вид рамки. Все возможные значения этого параметра перечислены в документации, результаты работы некоторых из них показаны на следующем рисунке (рисунок взят из документации).

Следующий пример демонстрирует использование параметра bbox.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    plt.text(-9.5, 0.9, '''bbox={"facecolor": "yellow",
                "boxstyle": "sawtooth",
                "hatch": "/",
                "edgecolor": "red"}'''
,
             bbox={"facecolor": "yellow",
                   "boxstyle": "sawtooth",
                   "hatch": "/",
                   "edgecolor": "red"})

    plt.text(-9.5, 0.6, '''bbox={"fill": False,
                "linestyle": "dotted",
                "linewidth": 2.0}'''
,
             bbox={"fill": False,
                   "linestyle": "dotted",
                   "linewidth": 2.0})

    plt.show()

Использование класса Text

До сих пор для настройки внешнего вида надписей использовались дополнительные параметры в функции text(), что удобно, если дополнительных параметров не много. Однако, с увеличением количества параметров, которые нужно задать, может оказаться, что нагляднее изменять внешний вид постепенно задавая каждый параметр. Также иногда надо изменять внешний вид уже существующей надписи. Для этого можно использовать классы matplotlib.text.Text и matplotlib.text.TextWithDash.

До сих пор мы не использовали тот факт, что функция text() возвращает экземпляр класса matplotlib.text.Text (если параметр withdash равен False) или matplotlib.text.TextWithDash (если параметр withdash равен True). Однако, получив такой объект, мы можем изменять его параметры, используя методы вида set_*, где вместо звездочки подставляются имена всех тех параметров, которые мы рассмотрели, например, можно использовать методы set_family(), set_bbox() и др. Также можно узнать текущие значения параметров, используя методы вида get_*.

Следующий пример показывает, как можно использовать экземпляры класса matplotlib.text.Text.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    xvals = np.linspace(-10.0, 10.0, 300)
    yvals = np.sinc(xvals)

    plt.plot(xvals, yvals)
    plt.xlim(-10.0, 10.0)
    plt.ylim(-0.4, 1.2)

    # !!!
    text_obj = plt.text (2.1, 0.6, 'Функция sinc')
    text_obj.set_color ('blue')
    text_obj.set_backgroundcolor ('red')
    text_obj.set_rotation (45)

    plt.show()

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

На этом мы закончим рассмотрение функции text(), но скорее всего мы еще будем к ней возвращаться в других примерах из этой серии статей.

Другие статьи про Matplotlib


Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.8/5. Всего 11 голос(а, ов)



Иван 12.12.2012 - 18:10

Ввод текста

Скажите а как можно в matplotlib ввести данные(цифры) которые в программе присвоятся каким то переменным и по которым построится график/гистограмма

Jenyay 12.12.2012 - 20:00

Если я правильно Вас понял, то для этого нужно использовать какую-нибудь библиотеку для построения GUI, например, wxPython.

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


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 281