Python

Установлен ли пакет?

Что проверить, установлен ли интересующий пакет, попробуем импортировать его.

Пусть нас интересует пакет NumPy. Запустим интерпретатор python и выполним импорт в командной строке

>>> import numpy

Если NumPy не установлен, получим сообщение об ошибке

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named numpy

Если же NumPy не установлен, высветится приглашение ввести очередную строку

>>>

Numpy и Scipy

Необходимы для выполнения математических расчетов. Установка с помощью apt-get

sudo apt-get install python-numpy python-scipy

С помощью pip также можно установить, например, SciPy из Subversion:

pip install svn+http://svn.scipy.org/svn/scipy/trunk/#egg=scipy

А вот обычный способ установки с помощью pip -- с помощью Python Package Index, например

pip install scipy

в данном случае не сработает.

Matplotlib

Двух- и трехмерная научная графика. Предварительно должен быть установлен пакет NumPy. Мatplotlib требует NumPy версии >= 1.4. Проверим, что у нас стоит нужная версия

>>> import numpy
>>> print numpy.__version__

Наконец, когда нужная версия NumPy установлена, выполним

sudo apt-get install python-matplotlib

Настройка matplotlib

Рассмотрим, как настроить отображение нужных шрифтов в matplotlib на примере простенькой программы рисования параболы:

import matplotlib as mpl
import matplotlib.pyplot as p 

p.plot([1,2,3,4], [1,4,9,16])
p.title('Парабола')
p.xlabel('Значения x')
p.ylabel('Квадраты значений x')
p.show()

Проблем здесь бывает две: 1) не отображаются кириллические символы; 2) по каким-то причинам пользователю требуется использовать другой тип шрифта (скажем, serif вместо sans-serif).

В первую очередь, для корректного отображения кириллических символов необходимо указать в программе, что соответствующая строка относится к типу unicode, т. е. заменить, строки вроде

p.title('Парабола')

на

p.title(u'Парабола')

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

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

Настройки matplotlib хранятся в конфигурационном файле matplotlibrc. Однако вносить изменения непосредственно в этот файл нежелательно. Даже если на вашей машине нет других пользователей, остается риск потерять настройки при переустановке пакета. Поэтому лучше скопировать этот файл в каталог пользователя ~/.matplotlib

Где хранится matplotlibrc? Ясно, что где-то среди конфигурационных файлов системы, но его расположение меняется от версии к версии. Поэтому проще всего его спросить у самого matplotlib. Запускаем интерпретатор и выполняем

>>> import matplotlib
>>> matplotlib.matplotlib_fname()

Вот что у меня получилось:

'/etc/matplotlibrc'

Параметры пакета задаются в файле в виде пар свойство : значение, символ '#', как обычно в Python, обозначает комментарий. Свойство font.family определяет тип активного шрифта по умолчанию и может принимать пять значений: serif, sans-serif, cursive, fantasy, monospace.

В свою очередь свойства font.serif, font.sans-serif, font.cursive, font.fantasy, font.monospace содержат списки имен шрифтов (через запятую, в порядке уменьшения приоритета) соответствующих каждому типу:

 font.family         : sans-serif
 ...
 font.size           : 12.0
 font.serif          : Bitstream Vera Serif, New Century Schoolbook
 font.sans-serif     : Bitstream Vera Sans, Lucida Grande, Verdana
 font.cursive        : Apple Chancery, Textile, Zapf Chancery
 font.fantasy        : Comic Sans MS, Chicago
 font.monospace      : Bitstream Vera Sans Mono, Andale Mono

Для "русификации" matplotlib необходимо поместить в эти списки имена доступных в системе шрифтов, содержащих кириллические символы. Например так:

 font.serif : Verdana, Arial
 font.sans-serif : Tahoma, Arial
 font.cursive : Courier New, Arial
 font.fantasy : Comic Sans MS, Arial
 font.monospace : Arial

У меня русские буквы отобразились корректно при настройках по умолчанию:

Текст отображается шрифтом sans-serif 12 пунктов

однако шрифт sans-serif (без засечек) мне нужно было заменить на serif (с засечками), и, к тому же, увеличить размер шрифта до 14-ти пунктов. Правим значения font.family и font.size и получаем:

Текст отображается шрифтом serif 14 пунктов

matplotlib можно настраивать и во время выполнения программы. Для этого в пакете определена структура matplotlib.rcParams, с которой работают как со словарем. Ключевые слова в данном случае -- имена свойств файла matplotlibrc.

Пример настройки шрифтов через matplotlib.rcParams (изменение семейства, которому относится активный шрифт):

import matplotlib as mpl
import matplotlib.pyplot as p

mpl.rcParams['font.family'] = 'fantasy'

p.plot([1,2,3,4], [1,4,9,16])
p.title(u'Парабола')
p.xlabel(u'Значения x')
p.ylabel(u'Квадраты значений x')
p.show()

Текст отображается шрифтом семейства *fantasy*

matplotlib обрезает рисунок

Случается, что при сохранении в файл с помощью savefig, matplotlib обрезает часть рисунка. Например, следующий рисунок обрезан по правой границе из-за чего испорчена подпись к оси

Рисунок, обрезанный matplotlib по правой границе

Это можно исправить, если задать прямоугольник (bounding box), в который помещается рисунок, прилегающим к границам рисунка снаружи с помощью параметра:

bbox_inches='tight'

mpltrimt.png

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

pad_inches=1.5

превосходит "облегающий" прямоугольник на 1,5 дюйма.

mpltrimt15.png



Комментарии

comments powered by Disqus