Pull to refresh

Qtiplot + Python дают огромные возможности для построения графиков и обработки данных

Reading time 4 min
Views 7.5K

Сегодня я немного расскажу про программу 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)





Ура, в колонке Y мы получили 10 числел Фибонначи. Но это была, так сказать, проба пера и проверка того что скриптинг работает. Понятно что каждый раз писать функцию не очень удобно, да и количество чисел захардкожено. Поэтому мы создадим свою функцию с блекджеком и .... Идём в ~/.qtiplot и создаём там файл, например, qtimyfunc.py со следующим содержанием (да я знаю что рекурсия это ламерство, но это просто иллюстрация):

#!/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 и теперь наша функция появится в выпадающем списке функций. Так как это полноценная питоновская программа, то туда можно запихать вообще всё, от простейшей рекурсии, до расчёта траектории космического корабля.



Но лень не стоит на месте. Каждый раз заполнять колонку, вводить функцию, нажимать кнопку уныло чуть менее, чем полностью. Поэтому мы напишем скрипт, который сам создаст табличку, запонит её и построит график. Отвлечёмся от Фиббоначи, допустим у нас есть некоторые экспериментальные данные, которые зашумлены и нам нужно построить проксимацию и мы знаем что по идее данные должны иметь квадратичный закон.

Пишем следующий скрипт:
#!/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


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



Кроме возможности вызывать скрипты из консоли Qtiplot умеет добавлять запуск скрипта в любой пункт меню или вешать на кнопочку панели инструментов. Таким образом, возможности кастомизации программы практически не ограничены, можно создать свои действия и вызывать их по одному клику мыши. Делается это в меню Scripting. И получится примерно так:



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

Tags:
Hubs:
+35
Comments 32
Comments Comments 32

Articles