24.08.2009

Дополнение Firefox Lazarus. Восстановление данных веб-форм

Бывает весьма грустно и досадно, когда, текст, набранный в веб форме любимого форума, блога или какого-нибудь социального сервиса (типа одноклассников) безвозвратно исчезает в результате ошибки на стороне сервере (характерно для выше помянутых одноклассников), дисконнекта (если вовремя не заметишь и нажмешь на кнопку "отправить") или сбоя питания (владельцы UPS могут по этому поводу не переживать). Сильное раздражение можно испытать и при попытке зарегистрироваться на некоторых популярных ресурсах - неофиту предлагается заполнить длинную форму, начиная с предполагаемого логина и пароля и заканчивая указанием в обязательных полях пола, возраста, даты рождения, часового пояса, города обитания и прочих личных предпочтений. После угадывания четырех цифр в тесте на дальтонизм происходит отправка данных заполненной формы. И вот как раз тут выясняется, что пользователь с указанным логином уже существует, причем сообщение об этом появляется на новой странице, замещающей страницу с формой. При возврате на страницу регистрации последняя так же перегружается, теряя при этом содержимое всех полей.

Иконка дополнения Firefox Lazarus

Пользователи Firefox легко могут избежать описанных недоразумений установив дополнение Lazarus. Это дополнение позволяет, в случае необходимости, восстановить данные веб форм одним не сильным кликом мышки.

Скачать последнюю версию Lazarus можно с официального репозитория дополнений addons.mozilla.org, домашняя страница дополнения lazarus.interclue.com.

После установки Lazarus будет автоматически сохраняет все данные вводимые пользователем в веб формы. При этом поддерживаются как "обычные" html формы, так и (частично) формы WYSIWYG редакторов, формы AJAXified, текстовые поля Richtext. Ввод в приложения Java и Flash дополнение перехватывать не способно.

Lazarus хранит собранную информацию в базе данных (на основе SQLite, файл lazarus.sqlite в папке профиля) в зашифрованном виде (авторы дополнения настаивают на более чем достаточной надежности принятого способа шифрования), и каждой форме, с которой сталкивался пользователь (URL страницы содержащей форму), в базе данных соответствует запись, включающая историю пользовательского ввода.

Как использовать дополнение?

И так, для того, что бы восстановить потерянные данные веб формы, необходимо повторно открыть страницу с злополучной формой. Кликнут правой кнопкой мыши на поле ввода формы (или на любом участке страницы охваченном тегом <form>), в появившемся меню найти два пункта относящихся к Lazarus - Recover Form и Recover Text.

Пример восстановления данных веб формы посредством дополнения Firefox Lazarus

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

Пункт Recover Form задействует механизм реализующий восстановление данных обычных html форм, пункт Recover Text механизм восстановления содержимого форм других поддерживаемых типов.

Строка примера текста может заканчиваться символами (A) или (S). В первом случае ввод был сохранен в базу данных Lazarus по ходу набора текста, во втором случае после того как пользователь инициировал отправку содержимого формы на сервер.

Утерянное содержимое можно восстановить и не открывая страницу с формой. После установки Lazarus в строке состояния браузера появляется иконка с крестом. По клику на иконке всплывет меню в котором присутствует пункт Search Lazarus...

Меню дополнения Firefox Lazarus

Lazarus предоставляет пользователю возможность проводить поиск по своей базе данных.

Окно поиска дополнения Firefox Lazarus

База поискового индекса Lazarus зашифрована, в следствие чего адекватные результаты поиска будут получены только при подстановке в поле поиска целых слов и фраз.

Поиск по базе данных Lazarus возможен только по целым словам и фразам

Выбрав из результатов поиска самую приглянувшиюся запись, можно просмотреть весь сохраненный текст, кликнув на кнопку в поле Recover

Окно просмотра сохраненного текста базы данных дополнения Firefox Lazarus

Забавно, если ввод в форму содержал теги html, окно просмотра будет содержать две вкладки - исходный код и его вид в браузере.

Окно просмотра сохраненного текста базы данных дополнения Firefox Lazarus

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

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

Не много о настройках.

Окно настроек дополнения разбито на три вкладки: General, Security и Database.

Вкладка General.

Окно настроек дополнения Firefox Lazarus. Вкладка General

Радиочекбоксы Show text in menu, Show saved time in menu - выбор, что показывать в меню Lazarus, начальный фрагмент текста или время сохранения.

Чекбокс Show icon in context menu - смысл прост, показывать/не показывать иконку Lazarus в контекстном меню.

Чекбокс Show icon in status bar - аналогичен предыдущему, показывать/не показывать иконку Lazarus в строке состояния.

Чекбокс Show Restore Notification - если он включен то после восстановления формы, ранее содержавшей обширный ввод, пользователь увидит вот такое сообщение с просьбой пожертвовать небольшие деньги на нужды развития проекта .

Пример сообщения дополнения Firefox Lazarus с просьбой пожертвовать деньги на развитие проекта

Вкладка Security.

Окно настроек дополнения Firefox Lazarus. Вкладка Security

Чекбокс Save passwords - если включить, Lazarus будет сохранять содержимое форм ввода паролей. Авторы дополнения рекомендуют этого не делать!

Чекбокс Remove saved forms after - установить время по прошествии которого сохраненный ввод будет автоматически удален из базы данных.

Чекбокс Require a password to restore forms - если установить, будет запрошен пароль, который, в дальнейшем, потребуется вводить при попытке восстановить содержимое любой формы.

Окно ввода пароля расширения Firefox Lazarus

Меню дополнения Firefox Lazarus при включенном пароле на восстановление содержимого форм

Чекбокс Disable Search Indexing - во включенном состоянии запрещает ведение поискового индекса. Авторы расширения заявляют, если злопыхатель получит доступ к папке профиля ни чего не подозревающего человека, то, используя зашифрованный файл поискового индекса и пользуясь каким то, не совсем мне понятным, хакерским методом атаки с помощью словаря, сможет восстановить отдельные слова ранее введенные пользователем в форму. Вот так. Пишите со всяким грамматическими ошибками и тогда ни какие словари хакерам не помогут.

Чекбокс Enable Lazarus in Private Browsing Mode - разрешить Lazarus в режиме приватного просмотра. Авторы дополнения, в случае активации этого чекбокса, советуют не забыть установить пароль на восстановление содержимого форм.

Вкладка Database.

Окно настроек дополнения Firefox Lazarus. Вкладка Database

Кнопка Search Lazarus - если нажать появится уже знакомое окно поиска по базе данных Lazaru.

Кнопка Remove all saved forms - удалить все сохраненные формы и их содержимое.

Кнопка Delete The Database - удалить файл базы данных, браузер при этом перезагрузится.

Ну вот собственно и все.

P.S.

Название дополнения Lazarus - это имя библейского персонажа Лазаря, простого парня воскрешонного Исусом Христом, а иконка дополнения это Анх (Анкх) - египетский крест, в частности символизирующий бессмертие, предстоящую вечную жизнь.


Читать далее...

21.08.2009

Пакет matplotlib. График с дополнительной осью ординат

Часто для различных научно-технических надобностей требуется график с двумя осями ординат (осями Y) и одной общей осью абсцисс (осью X). Вот python скрипт, который строит такой график.

 1 # -*- coding: UTF-8 -*-
 2 
 3 import matplotlib as mpl
 4 import matplotlib.pyplot as plt
 5 
 6 # Значения по оси X (Большая часть данных опущена)
 7 
 8 # Время, ч
 9 
10 X = [0.00, 0.08, 0.17, ... 3.42, 3.50]
11 
12 # Значения по осям Y (Большая часть данных опущена)
13 
14 # Степнь разложения
15 
16 Y_01 = [0.0000, 0.0000, 0.0000, ... 0.8180, 0.8482]
17 
18 # Температура, oC
19 
20 Y_02 = [ 21, 30, 70, ... 721, 724 ]
21 
22 # Задем размеры изображения диаграммы
23 
24 mpl.rcParams['figure.figsize'] = (8.0, 6.0)
25 
26 # Строим диаграмму
27 
28 # Получаем ссылку на объект типа matplotlib.axes.AxesSubplot, текущую диаграмму 
29 
30 ax_01 = plt.axes()
31 
32 # Задаем исходные данные для первой линии диаграммы (линии степени разложения), внешний вид линии и маркера.
33 # Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D
34 
35 line_01, = ax_01.plot(X, Y_01, 'bh:')
36 
37 # Задаем интервалы значений по осям X и основной оси Y
38 
39 ax_01.axis([-0.04, 3.6, -0.01, 0.90])
40 
41 # Включаем сетку по оси X и основной оси Y. Задаем цвет сетки
42 
43 ax_01.grid(color = 'b')
44 
45 # Задаем подписи к осям X и основной оси Y
46 
47 ax_01.set_xlabel(u'Время, ч')
48 ax_01.set_ylabel(u'Степень разложения')
49 
50 # Задаем заголовок диаграммы
51 
52 ax_01.set_title(u'Термограмма разложения оксалата кальция')
53 
54 # Включаем дополнительную ось Y
55 
56 ax_02 = ax_01.twinx()
57 
58 # Задаем исходные данные для второй линии диаграммы (линии степени разложения), внешний вид линии и маркера.
59 # Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D
60 
61 line_02 = ax_02.plot(X, Y_02, 'ro:')
62 
63 # Задаем интервалы значений по осям X и дополнительной оси Y
64 
65 ax_02.axis([-0.04, 3.6, 0.0, 800.0])
66 
67 # Задаем подпись к дополнительной оси Y
68 
69 ax_02.set_ylabel(u'Температура, \u00b0C')
70 
71 # Включаем сетку по дополнительной оси Y. Задаем цвет сетки
72 
73 ax_02.grid(color = 'r')
74 
75 # Задаем исходные данные для легенды и место ее размещение
76 
77 ax_02.legend((line_01, line_02), (u'Степень разложения', u'Температура'), loc = 'best')
78 
79 # Сохраняем построенную диаграмму в файл
80 # Задаем имя файла и его тип
81 
82 plt.savefig('termo.png', format = 'png')

В результате выполнения скрипта, в файле termo.png будет сохранено такое изображение:

Matplotlib. Пример графика с двумя осями ординат

Пояснения к скрипту.

В начале небольшое отступление. Matplotlib при работе со своими графическими объектами придерживается следующей идеологии: существуют текущая фигура (в документации figure) и текущая гм... диаграмма (в документации axes). Фигура это некое полотно на котором происходит построение чего либо. Диаграмма это объект принадлежащий фигуре (одной фигуре может принадлежать несколько диаграмм), к которому собственно и применяются команды pyplot. Диаграммы могут быть различных типов (в нашем случае прямоугольная 2D - обычный график). Тип диаграммы задается командой её построения (в нашем случае plot()) и определяет назначение диаграммы, внешний вид, свойства и возможные действия с ней.

В выражении ax_01 = plt.axes() мы получаем ссылку на объект типа matplotlib.axes.AxesSubplot - текущую диаграмму. Далее, при построении графика, мы пользуемся методами этого объекта, действие которых в целом аналогично действию рассмотренным в предыдущих постах функций модуля pyplot.

После построения первой линии диаграммы (зависимости степени разложения от времени) создаем новый объект класса matplotlib.axes.Axes и получаем ссылку на него: ax_02 = ax_01.twinx(). В результате на диаграмму ax_01 будет "наложена" вторая диаграмма ax_02, при этом, ось X будет общей для обеих диаграмм. Далее с помощью тех же методов, только уже принадлежащими объекту ax_02 строим и оформляем вторую линию (зависимость температуры от времени).

Вот и все, сохраняем получившееся творение.

Подробнее о фигурах и диаграммах поговорим позже.

Предыдущий пост по теме: Пакет matplotlib. Строим банальный график.

Следующий пост по теме: Пакет matplotlib. Наводим красивости.


Читать далее...

18.08.2009

Как вставить в блог фрагмент кода с подсветкой синтаксиса

Часто в блоге (на сайте) необходимо разместить фрагмент кода на том или ином языке программирования. Такой фрагмент будет выглядеть гораздо красивей и понятнее если сделать подсветку синтаксиса как в продвинутых текстовых редакторах. Но редактировать вручную каждую строчку кода, раскрашивая элементы каждый в свой цвет, совсем не хочется. Конечно можно воспользоваться каким-нибудь бесплатным скриптом разукрашивающим код автоматически. Но скрипт надо ещё где-то разместить, а подключать и настраивать его все равно придется правя html код сообщения (страницы).

К счастью можно обойтись без всяких дополнительных скриптов и не очень то напрягаться при этом. Для этого достаточно воспользоваться редактором Vim. В командной строке Vim вводим:

:help convert-to-html

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

:runtime! syntax/2html.vim

или воспользоваться командой:

:TOhtml

Готовый html файл откроется в отдельном окне редактора. Окно редактор после выполнения команды будет выглядеть вот так:

Из полученного html файла необходимо удалить всё непосредственно не касающееся кода (несколько строк в начале и конце файла). Если при размещении кода в блоге используется тег <pre> командой редактора:

:%s/<br>//g

можно удалить все теги <br>.

В blogger'е раскрашенный таким образом код будет выглядеть вот так:

 1 # -*- coding: UTF-8 -*-
 2 
 3 import matplotlib.pyplot as plt
 4 
 5 # Значения по оси X
 6 
 7 X = [20.0, 40.0, 60.0, 80.0, 100.0]
 8 
 9 # Набор значений по оси Y
10 
11 Y_10 = [0.97252, 0.94238, 0.89927, 0.85197, 0.79784]
12 Y_20 = [0.96864, 0.93518, 0.89113, 0.84344, 0.78934]
13 Y_30 = [0.96395, 0.92770, 0.88278, 0.83473, 0.78075]
14 
15 # Строим диаграмму
16 
17 # Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.
18 
19 plt.plot(X, Y_10, 'bD:',  label = u'Температура 10 \u00b0C')
20 plt.plot(X, Y_20, 'r^:',  label = u'Температура 20 \u00b0C')
21 plt.plot(X, Y_30, 'go:',  label = u'Температура 30 \u00b0C')
22 
23 # Задем интервалы значений по осям X и Y
24 
25 plt.axis([15.0, 105.0, 0.75, 1.0])
26 
27 # Задаем заголовок диаграммы
28 
29 plt.title(u'Зависимость плотности водных растворов этилового спирта от температуры')
30 
31 # Задаем подписи к осям X и Y
32 
33 plt.xlabel(u'Массовая доля этилового спирта, %')
34 plt.ylabel(u'Плотность, г/мл')
35 
36 # Задаем исходные данные для легенды и ее размещение
37 
38 plt.legend(loc = 'best')
39 
40 # Включаем сетку
41 
42 plt.grid()
43 
44 # Сохраняем построенную диаграмму в файл
45 # Задаем имя файла и его тип
46 
47 plt.savefig('spirit_02.png', format = 'png')
48 
49 plt.show()

Код на языку Python позаимствован из прошлого поста.

Под конец замечу, что Vim умеет подсвечивать синтаксис всех мыслимых языков программирования и описанным способом разукрасить и вставить в блог можно код чего угодно.

Предыдущий пост по теме: Как вставить картинку в блог.


Читать далее...

14.08.2009

Как вставить картинку в блог

Такой вопрос рано или поздно задет себе любой блогер.

Вот, на мой взгляд, самый простой способ.

Для того чтобы вставить изображение в сообщение блога, как и в любую другую html страницу, необходимо воспользоваться тегом <img>, в атрибуте src которого указать ссылку на это изображение. Для этого, прежде всего, необходимо разместить файл с изображением где-то в Интернет, так, чтобы любой пользователь мог получить к нему доступ. Здесь лучше всего (на мой взгляд) воспользоваться сервисом Google Picasa. Заводим (если еще нет) аккаунт Google, заходим на сайт сервиса. Жмем на кнопку "загрузить" сверху в середине страницы.

Появится окно с предложением создать или выбрать альбом

Для картинок размещаемых в блоге лучше всего создать отдельный частный альбом (например с именем блога или по тематике размещаемых картинок), что бы в дальнейшем, когда изображений станет много, этим хозяйством было проще управлять. Переходим по ссылке "создайте новый альбом" и создаем альбом.

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

После выбора альбома, сервис Picasa покажет форму для загрузки изображений. Пользователь за раз может загрузить пять файлов.

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

После того как кнопка изменения масштаба станет неактивной, кликаем правой кнопкой мыши на изображении. В всплывающем меню выбираем "Copy Image Location" (если у Вас браузер Firefox).

Далее в html редакторе блога в нужном месте Вашего сообщения размещаем тег <img src=""/>, устанавливаем курсор между двумя знаками кавычек и вставляем из буфера обмена ссылку на изображение.

<img src="http://lh6.ggpht.com/_oMYflydwAbM/Sok1WmSCqtI/AAAAAAAAAG0/RTXgIVzhGts/copy_image_location.png"/>

Сохраняем сообщение. Вот собственно и все.

Ну можно еще добавить, что в контекстном меню браузера Internet Explorer нет пункта "Copy Image Location", но там есть пункт "Property/Свойства". Кликаем правой кнопкой на картинке, выбираем пункт "Property".

В появившемся окне копируем ссылку на изображение.

Далее поступаем как описано выше.

Следующий пост по теме: Как вставить в блог фрагмент кода с подсветкой синтаксиса.


Читать далее...

10.08.2009

Пакет matplotlib. Строим банальный график

Те кому хотя бы раз в жизни приходилось обучаться в техническом ВУЗ'е строили такие графики штук по 5-10 в день. Банальный график это две пересекающиеся под прямым углом линии (координатные оси) на которые нанесены масштабные деления с числами. Линии снабжены подписями - что собственно эти числа обозначают. В плоскости образованной линиями, тем или иным способом (с помощью точек, кружков, треугольничков, крестиков и т.д.) помечаются некоторые значения. График снабжается легендой, чтобы можно было узнать чем кружки отличаются от крестиков и подписью, чтобы можно было узнать что и зачем построено. Вот именно такой график рисует нижеприведенный скрипт.

# -*- coding: UTF-8 -*-

import matplotlib.pyplot as plt

# Значения по оси X

X = [20.0, 40.0, 60.0, 80.0, 100.0]

# Набор значений по оси Y

Y_10 = [0.97252, 0.94238, 0.89927, 0.85197, 0.79784]
Y_20 = [0.96864, 0.93518, 0.89113, 0.84344, 0.78934]
Y_30 = [0.96395, 0.92770, 0.88278, 0.83473, 0.78075]

# Строим диаграмму

# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.
# Функция plot() возвращает кортеж ссылок на объекты класса matplotlib.lines.Line2D

line_10, line_20, line_30 = plt.plot(X, Y_10, 'bD:', X, Y_20, 'r^:', X, Y_30, 'go:')

# Задаем интервалы значений по осям X и Y

plt.axis([15.0, 105.0, 0.75, 1.0])

# Задаем заголовок диаграммы

plt.title(u'Зависимость плотности водных растворов этилового спирта от температуры')

# Задаем подписи к осям X и Y

plt.xlabel(u'Массовая доля этилового спирта, %')
plt.ylabel(u'Плотность, г/мл')

# Задаем исходные данные для легенды и ее размещение

plt.legend( (line_10, line_20, line_30), (u'Температура 10 \u00b0C', u'Температура 20 \u00b0C', u'Температура 30 \u00b0C'), loc = 'best')

# Включаем сетку

plt.grid()

# Сохраняем построенную диаграмму в файл

# Задаем имя файла и его тип

plt.savefig('spirit.png', format = 'png')

В результате выполнения скрипта файл spirit.png должен содержать такое изображение.

Matplotlib. Незамысловатый график

Комментарии к коду.

Функция plot() строит 2D диаграмму - задает исходные данные и внешний вид линии (линий) диаграммы. Функция принимает произвольное число наборов аргументов вида X_set, Y_set, format_string. Где X_set и Y_set типа list или numpy.array - значения откладываемые по осям X и Y соответственно, format_string - строка форматирования (не обязательный аргумент набора), определяет стиль и цвет линии. Строка форматирования (позаимствована из системы Matlab) включает (в произвольном порядке) три подстроки определяющих стиль линии, стиль маркера, цвет. Например 'g^:' = 'g' + '^' + ':' - цвет зеленый, маркер треугольник вершиной вверх, линия состоит из точек.

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

Стили линий


Символ Описание
'-' solid line style непрерывная линия
'--' dashed line style линия из штрихов
'-.' dash-dot line style чередование штрихов и точек
':' dotted line style линия из точек

Matplotlib. Стили линий

Стили маркеров


Я умышленно не стал переводить названия маркеров из документации, дабы не придумывать как по русски выразить различия между point marker и pixel marker или как обозвать tri_right marker с thin_diamond marker.

Символ Описание
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
'|' vline marker
'_' hline marker

Matplotlib. Стили маркеров

Цвета


Символ Цвет
'b' blue синий
'g' green зеленый
'r' red красный
'c' cyan бирюзовый
'm' magenta пурпурный
'y' yellow желтый
'k' black черный
'w' white белый

Matplotlib. Цвета

Функция plot() возвращает кортеж ссылок на объекты класса matplotlib.lines.Line2D. Каждый из объектов кортежа представляет линию на диаграмме. Посредством методов объектов можно менять свойства (внешний вид) любой из линий. В нашем случае кортеж ссылок в дальнейшем передается функции legend().

Функция axis() задает свойства осей диаграммы. В частности с её помощью можно установит масштаб осей. Для этого функции необходимо передать одни аргумент - список из четырех значений. Функция рассматривает такой список как [x_min, x_max, y_min, y_max], где x_min, y_min минимальные, x_max, y_max максимальные значения откладываемые по осям X и Y соответственно.

Функция может принимать в качестве одного аргумента и строку. Возможные значения такого аргумента и оказываемые ими действия представлены в таблице.

Аргумент Действие
'off' Выключает отображение осей (вместе с подписями)
'equal' Изменяет масштаб по осям так, чтобы равному изменению x или y соответсвовала одинаковая длинна на диаграмме. Как сказано в документации "круг превращается в круг".
'scaled' Тот же эффект, что у 'equal' достигается изменением соотношения сторон диаграммы.
'tight' Масштаб по осям изменяется так, что бы отображались все данные. Если все данные уже находятся в поле диаграммы, масштаб изменяется так, чтобы линии располагались в центре диаграммы.

Функция legend() задает свойства и расположения легенды диаграммы. В примере использован вызов функции принимающий в качестве первых двух аргументов кортежи - первый содержит ссылки на объекты типа Line2D, второй соответствующие им подписи. Именованный аргумент loc задает расположение легенды, может быть или строкой или числом. Возможные варианты значений аргумента loc представлены в таблице.

Значения аргумента loc Расположение легенды
Строка Число
'best' 0 Оптимальное расположение легенды определяется автоматически. Значение по умолчанию.
'upper right' 1 сверху справа
'upper left' 2 сверху слева
'lower left' 3 снизу слева
'lower right' 4 снизу справа
'right' 5 справа
'center left' 6 в центре слева
'center right' 7 в центре справа, не отличается от 'right'
'lower center' 8 в сентер снизу
'upper center' 9 в центре сверху
'center' 10 в центре диаграммы

Сформировать легенду можно и другим (на мой взгляд менее громоздким) способом. Функция plot() (если задано построение только одной линии) принимает именованный аргумент label. Это строка, подпись к линии, на основании которой вызов функции legend() без аргументов добавляет к диаграмме легенду. Вышеприведенный скрипт мог быть написан и так:

# Строим диаграмму

# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров, подписи.

plt.plot(X, Y_10, 'bD:',  label = u'Температура 10 \u00b0C')
plt.plot(X, Y_20, 'r^:',  label = u'Температура 20 \u00b0C')
plt.plot(X, Y_30, 'go:',  label = u'Температура 30 \u00b0C')

# Добавляем к диаграмме легенду

plt.legend(loc = 'best')

Функция grid() строит сетку координатных осей.

Функция savefig() сохраняет диаграмму в файл. Первый аргумент - строка, путь к файлу. Именованный аргумент format - строка, задает формат файла, может принимать значения 'png', 'pdf', 'ps', 'eps', 'svg'.

Здесь необходимо сказать пару слов о размерах и разрешении получающихся изображений диаграмм. В файле matplotlibrc можно задать два свойства figure.figsize и figure.dpi (свойства можно задать, разумеется и через структуру rcParams, смотри предыдущий пост).

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

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

Предыдущий пост по теме: Пакет matplotlib. Установка, проверка, настройка.

Следующий пост по теме: Пакет matplotlib. График с дополнительной осью ординат.


Читать далее...

09.08.2009

Пакет matplotlib. Установка, проверка, настройка

Введение

matplotlib - набор дополнительных модулей (библиотек) языка Python. Предоставляет средства для построения самых разнообразных 2D графиков и диаграмм данных. Достоинства. Отличается простотой использования - для построения весьма мудреных и красочно оформленных диаграмм достаточно нескольких строк кода. При этот качество получаемых изображений более чем достаточно для их публикования. Один из выходных формата файлов - Postscript, что, соответственно, позволяет вставлять изображения в документы TeX. Предоставляет API для встраивания своих графических объектов в приложения пользователя.

Установка

Официальный сайт проекта matplotlib. Дистрибутив для Windows можно заполучить на Sourceforge. Текущая версия 0.99.0, выпущена 06 августа 2009.

Для установки необходим, разумеется, сам Python и модуль NumPy. NumPy предоставляет методы для работы с огромными многомерными массивами. Дистрибутив для Windows так же можно взять на Sourceforge. Текущая версия 1.3.0 от 05 апреля 2009.

В Windows установка и matplotlib и NumPy не должна вызвать ни каких проблем. Скачиваем и запускаем файл дистрибутива.

Проверка

После установки проверяем работоспособность. Запускаем консоль Python, вводим:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x0301E810>]
>>> plt.title('Прямая линия')
<matplotlib.text.Text object at 0x03062430>
>>> plt.show()

В результате должно появиться вот такое окно диаграммы:

Matplotlib. Пример окна диаграммы

Что было сделано? Из пакета matplotlib импортирован модуль pyplot под именем plt. Модуль pyplot содержит функции (похожие на команды) создания диаграмм и изменения свойств их элементов. Функция plot() строит прямоугольные двумерные диаграммы (графики) в координатах X - Y. Если функции plot передан один аргумент (в нашем случае - список [1,2,3]), она рассматривает его как совокупность значений откладываемых по оси Y, тогда по оси X ему будет соответствовать автоматически сгенерированный набор чисел 0,1,2...N - 1, где N - число элементов в переданном списке. Функция title() задает заголовок диаграммы, а функция show() выводит интерактивное окно диаграммы. В общем все очень просто. Вот только вместо заголовка диаграммы "Прямая линия" 11 прямоугольников, не настроенный matplotlib не может найти шрифты с кириллическими символами.

Настройка

Пакет matplotlib можно легко настроить через конфигурационный файл matplotlibrc. Если Python установлен в папку C:\Python26\ файл matplotlibrc находится в папке: C:\Python26\Lib\site-packages\matplotlib\mpl-data\. Вносить изменения можно прямо здесь, но лучше скопировать файл в папку пользователя: C:\Documents and Settings\UserName\.matplotlib\, иначе при переустановке пакета конфигурационный файл будет перезаписан. Параметры пакета задаются в файле в виде пар свойство : значение, символ # отделяет комментарий. Свойство font.family определяет тип активного шрифта по умолчанию, может принимать пять значений: serif, sans-serif, cursive, fantasy, monospace. В свою очередь свойства font.serif, font.sans-serif, font.cursive, font.fantasy, font.monospace содержат списки имен шрифтов (через запятую, в порядке уменьшения приоритета) соответствующих каждому типу. Для "русификации" matplotlib необходимо изменить имена шрифтов в списке, на имена доступных в системе шрифтов, содержащих кириллические символы. Например так:

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

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

plt.title(u'Прямая линия')

В случае скрипта исходный файл должен быть в кодировке UTF-8. Кодировку файла так же следует указать явно. Для этого в первых строках программы пишем:

# -*- coding: UTF-8 -*-

Вносим изменения в файл matplotlibrc, повторяем ввод в консоле Python:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x02F118F0>]
>>> plt.title(u'Прямая линия')
<matplotlib.text.Text object at 0x02F59510>
>>> plt.xlabel(u'Значения по оси X')
<matplotlib.text.Text object at 0x02F1BBF0>
>>> plt.ylabel(u'Значения по оси Y')
<matplotlib.text.Text object at 0x02F44D10>
>>> plt.show()

Ну вот теперь подписи диаграммы отображаются корректно:

Matplotlib. Пример окна диаграммы

Функции pyplot.xlabel(), pyplot.ylabel(), как легко догадаться по названию, устанавливают подписи к осям X и Y соответственно.

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

Настройки шрифтов через matplotlib.rcParams можно изменить например так:

>>> import matplotlib as mpl
>>> import matplotlib.pyplot as plt
>>> mpl.rcParams['font.family'] = 'fantasy'
>>> mpl.rcParams['font.fantasy'] = 'Comic Sans MS, Arial'
>>> plt.plot([1,2,3,4], [1,4,9,16], 'ro')
[<matplotlib.lines.Line2D object at 0x02E837B0>]
>>> plt.title(u'Парабола')
<matplotlib.text.Text object at 0x02E65530>
>>> plt.xlabel(u'Значения x')
<matplotlib.text.Text object at 0x02E2DC70>
>>> plt.ylabel(u'Значения x в квадрате')
<matplotlib.text.Text object at 0x02E50D30>
>>> plt.show()

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

Matplotlib. Пример окна диаграммы

Функции pyplot.plot() можно передать произвольное число пар аргументов типов list или array (тип array определен в модуле numpy). В примере выше передана одна пара: [1,2,3,4], [1,4,9,16]. Первый элемент каждой пары функция рассматривает как значения откладываемые по оси X, второй элемент как значения по оси Y. Соответственно для каждой пары элементов строиться своя кривая на диаграмме. После каждой пары данных может быть передан дополнительный аргумент типа string - строка форматирования, которая определяет внешний вид кривой. Формат строки позаимствован из системы Matlab. Строка включает три подстроки. Первая подстрока задает цвет графического элемента, вторая стиль маркера, третья стиль линии. В примере 'ro' = 'r' + 'o', где 'r' - красный, 'o' - кружок. По умолчанию 'b-' - синяя непрерывная линия.

Немного о назначении кнопок интерактивного окна диаграммы.

Кнопка

Matplotlib. Кнопка pan/zoom

(pan/zoom) предназначена для прокрутки/масштабирования диаграммы. Нажимаем на кнопку, указатель мыши приобретает вид перекрещенных стрелок. Если двигать мышь и удерживать левую кнопку - диаграмма будет прокручиваться по направлению движения указателя. Если двигать мышь и удерживать правую кнопку - масштаб диаграммы будет изменяться, при движении вверх/вправо - уменьшаться, вниз/влево - увеличиваться. При нажатых клавишах "x" и "y" перемещение/масштабирование диаграммы будет происходить по осям X и Y соответственно, при нажатой клавише Ctrl диаграмма будет изменяться так, чтобы сохранились её пропорции (aspect ratio).

Кнопка

Matplotlib. Кнопка прямоугольного масштабирования

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

Кнопки

Matplotlib. Кнопка навигации

позволяют перемещаться по истории изменения диаграммы. Все изменения вносимые в диаграмму пользователем (масштабирование, прокрутка) запоминаются. Кнопки со стрелками позволяют перемещаться вперед/назад по имеющимся вариантам диаграммы. Кнопка с домиком возвращает диаграмму к исходному состоянию.

Кнопка

Matplotlib. Кнопка сохранения диаграммы

вызывает стандартный для системы диалог сохранения файла. Позволяет сохранить диаграмму в файл. Можно выбрать следующие форматы файла диаграммы: png, pdf, svg, eps, ps. К сожалению не работает сохранение в формате emf (модуль pyemf разработчиком больше не поддерживается). Через формат emf было очень удобно вставлять диаграммы в документы Word.

Следующий пост по теме: Пакет matplotlib. Строим банальный график.


Читать далее...

Приветствую Вас на Незамысловатом блоге

Решил тоже поиграться с блогами - вот моя первая попытка блогописания.

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

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


Читать далее...