![](http://soft.proindependent.com/qtiplot_logo.png)
Сегодня я немного расскажу про программу QtiPlot и возможность скриптования её возможностей с помощью языка Python.
Программа QtiPlot разрабатывается как свободный аналог Origin, то есть универсального средства представления и анализа данных. Она позволяет строить всевозможные графики, выполнять операции с данными, искать аппроксимации кривых и тд. С Ориджином я не работал с первого курса института, так что сравнить возможности не смогу, да это и не важно, QtiPlot имеет три важнейших преимущества, это свободность, кроссплатформенность и скриптование на языке Python, о котором пойдёт речь дальше.
В настоящее время «стандартом де факто» для построения графиков в мире *nix систем является gnuplot, в мире Windows это Origin, видимо ломанный, если посмотреть на его стоимость (чуть менее $1000 за самую крутую версию). Так вот QtiPlot в месте с Питоном вполне могут потеснить эти продукты.
Для начала нам нужно установить qtiplot. Лучше всего это сделать из репозиториев своего дистрибутива, потому что это с большой гарантией означает то, что все библиотеки будут слинкованы верно (Например, для opensuse 11.1). Можно взять бинарник с сайта, но он слинкован против python 2.5, а сейчас почти у всех уже стоит 2.6, так же можно скомпилить самому, но это не так-то просто. Кстати, говоря, тут мы сталкиваемся с примером платного свободного софта. Пользователи Windows могут скачать только демоверсию, полная версия стоит денег. Ну или могут откомпилить сами. Либо найти в интернете альтернативную сборку. А можно и купить, стоит всего 20 евро, по сравнению с ориджин просто копейки.
NB *nix users! До установки надо убедится что стоит Python и пакет python-sip, без этого скриптинг работать не будет.
Вторым шагом нужно включить поддержку скриптов, для этого нам понадобятся инизалиционные файлы qtiplotrc.py и qtiUtil.py. К сожалению, в них допущены ошибка, без исправления которой работать скриптинг, поэтому лучше скачать файлы у меня. Кладём их в какое-нибудь место, например ~/.qtiplot/ и запускаем qtiplot. Далее View -> Preferences -> General -> File Locations выбираем директорию куда мы положили файлы. Теперь остаётся только включить питон, Scripting -> Scripting Language -> Python и открыть консоль View -> Console. Консоль должна содержать надпись «python is ready», если используете мои файлы. На самом деле это никакая не консоль, а вывод cout, что несколько разочарорвывает.
Если всё получилось, можно начинать играться! Давайте, например, построим последовательность Фиббоначи. По умолчанию одна таблица у нас уже есть, в колонке X делаем Fill Column With -> Row Numbers, в колонке Y выбираем Set Column Values и впишем туда небольшую программу, как показано на рисунке. Не забываем снять галочку Use muParser. К соажелнию, она активная по умолчанию, что дико бесит.
t=currentTable() t.setCell(2,1,1) t.setCell(2,2,1) for in range (3,10): t.setCell(2,i,t.cell(2,i-1)+t.cell(2,i-2)
![](http://uploaded.ivlis.com/image/2009/06/21/1245562150fibb_easy.png)
Ура, в колонке Y мы получили 10 числел Фибонначи. Но это была, так сказать, проба пера и проверка того что скриптинг работает. Понятно что каждый раз писать функцию не очень удобно, да и количество чисел захардкожено. Поэтому мы создадим свою функцию
#!/usr/bin/python<br>
<br>
import qti, math<br>
<br>
#global fib<br>
def fib(n):<br>
"Calculates fibonacci numbers"<br>
if n == 0:<br>
return 0<br>
elif n == 1:<br>
return 1<br>
else:<br>
return fib(n-1) + fib(n-2)<br>
<br>
И добавляем в файл qtiplotrc.py строчку import_to_global(«qtimyfunc», None, True). Перезапускакем qtiplot и теперь наша функция появится в выпадающем списке функций. Так как это полноценная питоновская программа, то туда можно запихать вообще всё, от простейшей рекурсии, до расчёта траектории космического корабля.
![](http://uploaded.ivlis.com/image/2009/06/21/1245562289fib_graph.png)
Но лень не стоит на месте. Каждый раз заполнять колонку, вводить функцию, нажимать кнопку уныло чуть менее, чем полностью. Поэтому мы напишем скрипт, который сам создаст табличку, запонит её и построит график. Отвлечёмся от Фиббоначи, допустим у нас есть некоторые экспериментальные данные, которые зашумлены и нам нужно построить проксимацию и мы знаем что по идее данные должны иметь квадратичный закон.
Пишем следующий скрипт:
#!/usr/bin/python<br>
import sys<br>
<br>
import qtimyfunc<br>
import random<br>
random.seed()<br>
<br>
t = newTable("Data", 20, 2)<br>
t.setColName(1, "x")<br>
t.setColumnRole(1, Table.X)<br>
t.setColName(2, "y")<br>
t.setColumnRole(2, Table.Y)<br>
for i in range(1, 20):<br>
t.setCell(1,i,i)<br>
t.setCell(2,i,(i+(random.randint(0,100)-50)/20)**2)<br>
g = plot(t, t.colName(2), 1).activeLayer()<br>
<br>
f = PolynomialFit(g, "Data" + "_" + t.colName(2), 2, True)<br>
f.fit()<br>
<br>
Скрипт использует Qtiplot Python API, он очень простой и хорошо документирован. Чтобы его запустить выполняем команду из консоли. Естественно, myscript.py должен находится в области видимости.
$ qtiplot -x myscript.py
Результатом выпонения скрипта будет, радующая глаз, картинка:
![](http://uploaded.ivlis.com/image/2009/06/21/1245562507Approx2.png)
Кроме возможности вызывать скрипты из консоли Qtiplot умеет добавлять запуск скрипта в любой пункт меню или вешать на кнопочку панели инструментов. Таким образом, возможности кастомизации программы практически не ограничены, можно создать свои действия и вызывать их по одному клику мыши. Делается это в меню Scripting. И получится примерно так:
![](http://uploaded.ivlis.com/image/2009/06/21/1245562590my_script.png)
Следует отметить, что программа постоянно развивается, добавляются мовые возможности, расширяетмся API, улучшается интерфейс. К сожалению, сейчас о программе мало кто знает, надеюсь эта статья поможет её распространению. Также у программы есть форум где выкладываются всякие полезные дополнения на питоне.