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

Немного рекламы

Содержание

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

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

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.

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab


if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u"The sinc function")

    pylab.show()

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

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

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u'Default font')
    pylab.text (0.4, 1.0, u'family="sans-serif"', family="sans-serif")
    pylab.text (0.7, 0.9, u'family="serif"', family="serif")
    pylab.text (1.0, 0.8, u'family="fantasy"', family="fantasy")
    pylab.text (1.3, 0.7, u'family="monospace"', family="monospace")

    # Задание шрифта по имени
    pylab.text (1.6, 0.6, u'family="verdana"', family="verdana")

    pylab.show()

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

У меня под Ubuntu 12.10 и matplotlib 1.2.0 этот параметр отказывается принимать значение "cursive", выводя ошибку:

UserWarning: findfont: Font family ['cursive'] not found. Falling back to Bitstream Vera Sans
  (prop.get_family(), self.defaultFamily[fontext]))

Поэтому в данном примере пропущено это значение.

Вывод русских букв

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u"Надпись на русском языке")

    pylab.show()

Результат может выглядеть так:

Решить проблему довольно легко, достаточно выбрать шрифт, нормально отображающие русские буквы, например, "Verdana":

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u"Надпись на русском языке", family="verdana")

    pylab.show()

В результате надпись станет видна:

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u"Надпись на русском языке", fontdict={'family':'verdana'})

    pylab.show()

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.rc('font',**{'family':'verdana'})
    pylab.text (0.1, 1.1, u"Надпись на русском языке")

    pylab.show()

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u'size="xx-small"', size="xx-small")
    pylab.text (0.3, 1.02, u'size="x-small"', size="x-small")
    pylab.text (0.5, 0.94, u'size="small"', size="small")
    pylab.text (0.7, 0.86, u'size="medium"', size="medium")
    pylab.text (0.9, 0.78, u'size="large"', size="large")
    pylab.text (1.1, 0.70, u'size="x-large"', size="x-large")
    pylab.text (1.2, 0.6, u'size="xx-large"', size="xx-large")
    pylab.text (1.3, 0.45, u'size=30', size=30)

    pylab.show()

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u'style="normal"', style="normal")
    pylab.text (0.3, 1.02, u'style="italic"', style="italic")
    pylab.text (0.5, 0.94, u'style="oblique"', style="oblique")

    pylab.show()

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

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

    pylab.show()

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

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

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

    pylab.show()

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

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

    pylab.show()

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (4.0, 1.1, u"Transparent text. alpha = 0.1", alpha=0.1)
    pylab.text (4.0, 1.02, u"Transparent text. alpha = 0.3", alpha=0.3)
    pylab.text (4.0, 0.94, u"Transparent text. alpha = 0.5", alpha=0.5)
    pylab.text (4.0, 0.86, u"Transparent text. alpha = 0.7", alpha=0.7)
    pylab.text (4.0, 0.78, u"Transparent text. alpha = 0.9", alpha=0.9)

    pylab.show()

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    pylab.text (0.1, 1.1, u'rotation="horizontal"', rotation="horizontal")
    pylab.text (1.2, 1.0, u'rotation=45', rotation=45)
    pylab.text (1.5, 0.65, u'rotation="vertical"', rotation="vertical")

    pylab.show()

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

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

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

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

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

    pylab.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.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy
import pylab

if __name__ == "__main__":
    xvals = numpy.arange (-10.0, 10.1, 0.1)
    yvals = numpy.sinc (xvals)

    pylab.plot (xvals, yvals)

    text_obj = pylab.text (2.1, 1.1, u"The sinc function")
    text_obj.set_color ("blue")
    text_obj.set_backgroundcolor ("red")
    text_obj.set_rotation (45)

    pylab.show()

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

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

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

Остальные примеры


Немного рекламы

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

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



Иван 12.12.2012 - 18:10

Ввод текста

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

Jenyay 12.12.2012 - 20:00

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

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


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