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


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

    Поделиться публикацией
    Комментарии 32
      +7
      VIM умеет, командой :TOhtml
      Вот пример того, что у него получается:

       1 #!/usr/bin/python
       2
       3 def fib(n):
       4     "Calculates fibonacci numbers"
       5     if n == 0:
       6         return 0
       7     elif n == 1:
       8         return 1
       9     else:
      10         return fib(n-1) + fib(n-2)
      11
        +5
        А если обрамить тегами <code> и </code>, то выйдет и вовсе замечательно ;)

         1 #!/usr/bin/python
         2
         3 def fib(n):
         4     "Calculates fibonacci numbers"
         5     if n == 0:
         6         return 0
         7     elif n == 1:
         8         return 1
         9     else:
        10         return fib(n-1) + fib(n-2)
          0
          и в KDEшных редакторах есть возможность «Сopy as HTML» и «Export as HTML...»
            0
            Спасибо!
              +1
              Блин, этот vim безграничен! А я то пользовался какими то онлайн конвертилками. Спасибо!
              0
              Есть что-нибудь подобное, но чтобы дружило с PHP? Кроме FLOT.
                0
                А зачем php? Если хотите строить графики на сайте, то лучше использовать консольный гнуплот, а вычиления численные всё таки лучше на питоне проводить.
                  0
                  Понятно, спасибо.
                –1
                А еще есть язык R, для того же предназначенный.
                  0
                  Да. Пользуетесь? Мне казалось он для статистических исследований больше применяется, а для построения графиков там тот же gnuplot вроде.
                    –1
                    Нет, не пользуюсь, читал про него. Там можно строить графики в Postscript-формате чтобы включить, допусти, в LaTeX.
                      0
                      Ну это и есть gnuplot. Также как в Octave.
                  0
                  А как оно по сравнению с MathGL? У него фроде есть фронтенд — udav.
                    0
                    Не знаю. Посмотрю на MathML, выглядит красиво. Но вроде как-то более заморочено
                    0
                    Неужели теперь можно будет не делать
                    python buildgraph.py > points
                    gnuplot «points» using 1:2:3
                      0
                      Ага, типа того ;)
                      0
                      Очень интересный продукт судя по описанию! Судя по статье, он для тех кому учить R это слишком большой оверхед, но периодически тянет делать исследования посещаемости сайти или что то такое. То есть просто для меня :)
                      Я понимаю что при наличее питона можно сделать почти все… но хотелось бы что было из коробки. Можно ли использовать базу (например MySQL) как источник данных?
                        0
                        ну если там питон полноценный (не потестировал еще) — юзайте import какой-нибудь.
                        если нет — всгда есть способ, описанный в комменте выше с полноценным питоном.
                          0
                          Да питон полноценный вполне.
                          0
                          Этот код который я написал наверху мой первый код на питоне, поэтому не знаю как работать с mysql из питона. Но в qtiplot используется настоящий питон, так что точно можно вытащить всё что угодно.
                            0
                            Скорее, судя по тому, что есть Python API, он хорошо подойдёт для всевозможной автоматизации построения графиков, ибо получение publication-ready png/svg/pdf напрямую из скриптового языка — это удобно.

                            Хотя гнуплот подкупает универсальностью(можно юзать откуда угодно), равно как и R — мощностью и богатой библиотекой готовых фукнций. А для посещаемости сайта удобно юзать rrdtool.
                              0
                              У гнуплота есть существенные недостатки, в частности его довольно доисторический язык и плохая управляемость по стороны. Я как-то писал на C++ к нему функции доступа, замучался, ничего особо хорошего и красивого не получилось.
                            0
                            Пытаюсь поставить — некоторые проблему. Может быть сталкивались...?
                            У меня openSuse 11.1
                            при попытке запустить установку download.opensuse.org/repositories/home:/ars3niy/openSUSE_11.1/x86_64/qtiplot-0.9.7.7-2.1.x86_64.rpm выскакивает вот такая ошибка
                            yfrog.com/29qtiplotp

                            У меня 32 битная система. может быть дело в этом?
                              0
                              ой, так лучше не делать, это очень плохо :)

                              Идёте сюда:

                              software.opensuse.org/search

                              Там вводите qtiplot, кликаете One Click Install и всё само поставится для нужной архитектуры
                                0
                                Спасибо большое! Что то ступил. Так гораздо лучше — поставилось :) Буду играться!

                                Жаль плюсануть не могу…
                              +1
                              Посмотрев возможности Qtiplot, и учитывая то, что Qtiplot не является полностью свободным (стоит денег для win и mac), я не увидел преимуществ по сравнению с matplotlib+scipy.

                              Тот же matplotlib прекрасно может как заменить gnuplot для простых задач, типа считать файлик и сделать plot(x,y), так и способен делать серьезные графики для научных публикаций.
                              matplotlib.sourceforge.net/gallery.html
                                0
                                Свободный != бесплатный, так что qtiplot как раз полностью свободный. Вот тут есть какой-то его форк, котоый снабжён даже инсталлером scidavis.sourceforge.net/download.html

                                я так понимаю что matplotlib это библиотека к питону, это немного не то. Каких библиотке over 9000 можно найти для любого языка. Qtiplot это нечто большее, программировать там не надо уметь — вози мышкой и тыкай кнопки.
                                  0
                                  Ну вы просто представили qtilot, в частности, альтернативой gnuplot'у. А мне кажется, что matplotlib тут будет ничуть не хуже.
                                  Что касается возни мышкой и менюшек, то тут, согласен, matplotlib qtiplot-у не конкурент.
                                    0
                                    Ну она и есть альтернатива гнуплоту. В гнуплоте тоже есть свой интерфейс и тоже есть api взаимодействия с другими языками.
                                0
                                а почему подписи к осям и названия на английском? такая же проблема с русскими подписями как в гнуплоте?

                                гнуплот великолепен, НО до сих пор в нем проблема с локалями: с utf8 не работает, русские надписи только через изврат типа
                                iconv gnuplot.graph -f utf8 -t KOI8-R > gnuplot

                                при этом в файле gnuplot.graph нужно указать кодировку KOI8R
                                но главное западло, если понадобяться греческие буквы в обозначении осей :(

                                сейчас пытаюсь освоить matplotlib, так и тут блин проблема: мне нужны «сглаженные» графики подобно тем, который строят OpenOfice Calc и MS Excel (с апроксимацией) и (или) с линией тренда, а в matplotlib просто соединяет линии прямыми, может кто то подскажет как решить проблему (я понимаю, что можно сначала прогнать и мат обработать данные, а потом строить график, но ищу решенее попроще...), посмотрел документацию и пока ничего не нашел, в гнуплоте можно строить линии с апроксимацией используя его средства, может и в matplotlib есть такие инструменты?
                                  0
                                  С русским всё в порядке, я как-то не привык на нём подписывать графики


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

                                  редактирую файл в vim (Ubuntu 9.04) все хорошо, пока не вставлю в файл хотя бы один символ на русском, как только появляется русский, vim отказывается сохранять файл
                                  "«gnuplot.graph» ОШИБКА ПРЕОБРАЗОВАНИЯ 13L, 333C записано
                                  E37: Изменения не сохранены (добавьте !, чтобы обойти проверку)
                                  E162: Несохранённые изменения в буфере «gnuplot.graph»
                                  Press ENTER or type command to continue"

                                  а команда iconv gnuplot.graph -f utf8 -t KOI8-R > gnuplot
                                  заканчивается руганюю
                                  iconv: illegal input sequence at position 158

                                  может с локалями что то накрутил?

                                  добавлял koi8-r так
                                  sudo vim /var/lib/locales/supported.d/ru
                                  в него в конце добавил строку
                                  ru_RU.KOI8-R KOI8-R
                                  sudo locale-gen

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

                                  Самое читаемое