Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20071004

Сравнение 9 программ для построения графиков

Как известно, среди пользователей GNU/Linux довольно много людей из академической среды, то есть тех людей, которые наблюдают, измеряют, вычисляют, сравнивают и пишут в конечном итоге научные статьи. Эта работа обычно сопряжена с графическим представлением информации или визуализацией. В простонародье — построением графиков. Именно о программах, для этого предназначенных, и пойдёт речь.

Я сравнил 9 свободных программ для визуализации двумерных и одномерных данных. Все эти программы доступны в GNU/Linux, а многие — доступны и пользователям других операционных систем. Все 9 программ позволяют строить такие графики, которые не стыдно показывать или печатать. Это то, что называется «publication quality».

Выбор программ ограничен теми, которые предназначены для визуализации одномерных или двумерных данных. Под одномерными (1D) данными я подразумеваю отображение одного одномерного множества на другое, например функциональную зависимость y = sin(x). Под двумерными (2D) данными я подразумеваю отображение двумерного множества на одно- или двумерное, например функциональную зависимость z = x*x + y*y или векторно-значную функцию заданную на плоскости. На мой взгляд, именно визуализация одно- и двумерных данных — самая распространённая задача.

Программы, ориентированные в первую очередь на визуализацию многомерных данных, из сравнения исключены. Однако упоминания все эти программы вполне заслуживают: OpenDX, VTK, MayaVi, Vis5D+. Всё это интересная, но уже совсем другая история. Так же в сравнении не учавствовали программы для построения графов и для других, экзотичных, способов визуализации. Из них стоит упомянуть graphviz и prefuse.

Итак, в сравнении учавствовалии:
  • gnuplot — ветеран отрасли, поэтому с ним знакомы и умеют работать почти все, кому нужны графики; я сам пользуюсь им с удовольствием, поскольку с помощью всего одной-двух коротких команд можно сносно отобразить данные;
  • Gri — менее известный проект, фактически язык программирования для рисования научных графиков; изначально активно использовался для представления географической информации, поэтому здесь полный порядок с изолиниями и цветовыми картами;
  • matplotlib — сравнительно молодой, но богатый возможностями и активно развивающийся проект, является библиотекой для языка Python; особенность matplotlib — синтаксис, приближенный к MATLAB; отсюда и второе название проекта: pylab;
  • PyX — другой пакет для визуализации с помощью Python; выбор между matplotlib и PyX во многом дело вкуса, но надо отметить, что некоторые вещи естественнее делать в одном, а другие — в другом (см. таблицу);
  • Tioga — библиотека для языка Ruby, использующая PDFLaTeX для отрисовки графиков; как следствие — радующий глаз качественный результат, но достаточно крутая кривая обучения (кроме освоения Ruby потребуется разобраться с самой тиогой);
  • Ctioga — та же самая Tioga для тех, кто хочет сейчас и сразу; параметры графика задаются из командной строки, а для его рисования уже используется Tioga; к сожалению, годится Ctioga только для одномерных данных, но для них вполне может заменить gnuplot;
  • GNU plotutils — они же утилитка graph; лично я нахожу её интерфейс менее интуитивным и удобным для работы, а возможности более ограниченными, чем у других программ; однако входящая в тот же пакет библиотека libplot может быть интересна с точки зрения написания своих программ для построения графиков;
  • plotmtv — далеко не новый проект, и, как мне кажется, находящийся в стагнации; отлично справляется с двумерными скалярными и векторными данными; основной недостаток: команды для построения графиков необходимо внедрять в файлы с данными; зато, если файлы в формате plotmtv уже есть, строить графики просто, качество весьма приличное, а основные параметры графика можно поменять и с помощью графического интерфейса;
  • Grace — единственная программа из рассмотренных, в которой можно полностью контроллировать построение графиков с помощью графического интерфейса; к сожалению, именно поэтому мне до сих пор не удалось с ней подружиться; возможности у неё весьма приличные, но годится она для визуализации только одномерных данных;
Надо сразу сказать, что у каждой программы есть свои сильные и слабые стороны. Поэтому выбор подходящей программы — это вопрос, который каждый должен решать сам. Выбор зависит от того, какие данные и в каком формате имеются, какие графики хочется получить, насколько высоки оформительские требования, насколько быстро нужно получить графики и в каком количестве их строить... Приведённая ниже сравнительная таблица должна в этом помочь. Для начала советую обратить внимание на примеры (ссылки на галереи с примерами в таблице), они быстро дадут представление о том, на что эти программы способны.

Я лично пользовался и пользуюсь gnuplot, Gri, matplotlib, Tioga и Ctioga — и доволен каждой из них. Если нужно отрисовать что-то быстро (для себя) — обычно gnuplot, Gri или Ctioga мой выбор. Gnuplot также использую, если нужно отрисовать поверхность уровня. Если нужно рисовать изолинии или цветовые карты по двумерным данным, лучше всего с этим справляются Gri и Tioga. Это может делать и matplotlib, но с ней я познакомился сравнительно недавно и использовал пока что только для разных диаграмм.

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

Сравнительная таблица доступна онлайн на Google Docs, и прямо здесь (правда, придётся использовать прокрутку):



Смотрите также:

Как построить график с изолиниями в gnuplot, gri и pylab
Как строить цветные поверхности в gnuplot в режиме pm3d
Как отрисовывать географические карты и отображать на них данные с помощью GMT

21 коммент.:

Анонимный комментирует...

восхищен, особенно таблицей

jetxee комментирует...

Очень приятно. Этот пост я долго готовил... :)

virens комментирует...

Замечательный пост! Унёс к себе в скрапы изучать и пробовать другие графостроительные приложения. Класс, особенно таблица :-)

Но есть несколько замечаний.

Не согласен с тем, что качество вывода у гнуплот "среднее". Это как!? Если выводить в PS, оно тем более publication ready. За что так гнуплот обидели? Таки настаиваю на "высокое" :-)

"Интеграция с приложениями" = "да, LaTeX" :-) Постсрипт-график сразу кидается в каталог с рисунками и тут же вставляется в высококачественный документ, сделанный ЛаТеХом.

"Отображение формул" = "да, +". В режиме enhanced postscript ещё как выводит: из {/Symbol} можно накрутить что угодно. Хотя трудно :-)

"Даты по осям" = "да". Можно написать скрипт на любом языке, который будет делать "set tics" и впихивать туда даты. Отображение в точках данных значений так же возможно.

Но ещё раз: в целом всё очень здорово написано. Снимаю шляпу.

jetxee комментирует...

Насчет оценки качества графиков гнуплот я сам сомневался. Дело тут не в том, что может или не может он создавать постскрипт или пдф, это могут все рассмотренные программы. Речь скорее о том, насколько богаты возможности контролировать графический стиль, нюансы, вид надписей, композицию графика.. В общем, я пришел к выводу, что хотя гнуплот отличный рабочий инструмент, в плане оформительских возможностей он уступает другим пакетам. Например, он не умеет рисовать линии переменного цвета или толщины, работать с прозрачностью и накладывать график на изображение, делать заливку указанных областей под графиком и гарантировать совпадение шрифта на графике и в документе, в котором график будет использоваться. Поэтому оценка (графического) качества: среднее. Более молодые конкуренты предоставляют более богатые возможности.

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

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

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

atany комментирует...

Отличное и очень полезное сравнение!

Хотелось бы еще добавить в табличку asymptote.
Часто пользуюсь этим мощным инструментом и очень доволен. С помощью asymptote можно нарисовать практически любой векторный рисунок - не только графики. При этом качество результата высочайшее.

Я добавил колонку для asymptote в сравнительную таблицу (модифицированная таблица лежит здесь), но не уверен в точности добавленной информации :)

P.S. было бы еще неплохо добавить примеры команд/небольших скриптов для визуализации, чтобы наглядно можно было сравнивать синтаксис.

jetxee комментирует...

atany,

Огромное спасибо за такой полезный комментарий. Про asymptote узнал впервые, но судя по галерее на их сайте — инструмент более чем достойный.

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

По поводу добавления примеров скриптов — не знаю, насколько это подходит к жанру сравнительной таблицы. Да и некоторые инструменты (Tioga, matplotlib) требуют как правило скриптов, занимающих более двух-трёх строчек, другие (plotmtv) — требуют особый формат данных... Думаю, лучше оставить просто ссылки на галереи с примерами, разработчики сами их отбирают и обновляют.

Анонимный комментирует...

Пара слов в защиту gnuplot. Да, он действительно не умеет того, что вы написали. Но gnuplot генерирует очень простой и понятный PostScript код (я использую только ps для вставки в latex). С этим кодом можно делать практически всё что угодно, в том числе и скриптами. Переопределить стиль линии или сделать собственный тип point'ов - очень просто. Не сложно заставить gnuplot использовать cm-super шрифты, чтобы было одно и тоже в документе и на рисунке.

Кстати, есть ещё такая вещь как GMT (http://gmt.soest.hawaii.edu/). В основном, это географические карты, но и векторные поля и 2d графика там тоже есть.

jetxee комментирует...

Спасибо за то, что нашли ещё одного кандидата на включение в таблицу. Честного говоря, я искренне надеялся, что увидев эту таблицу читатели насоветуют ещё и много чего другого, о чём я ещё даже не слышал. Вот теперь добавился и GMT. Это очень радует.

Видимо, необходимо будет выпустить таблицу версии 1.1. С дополнениями.

Gnuplot я тоже очень люблю, — он удобный. Однако манипуляции с графиком на уровне Postscript — это, по-моему, уже дело гораздо более хитрое... Да и читаемый Postscript не один gnuplot создаёт. В общем, gnuplot отличный инструмент, и у него есть своя ниша, но некоторые вещи лучше и легче получаются с помощью других инструментов.

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

Макс комментирует...

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

Вот еще один хороший обзор.

Георгий комментирует...

> Видимо, необходимо будет выпустить таблицу версии 1.1. С дополнениями.

Тогда в неё стоит добавить LabPlot

jetxee комментирует...

Что ж, добавим и LabPlot. Спасибо за информацию.

Анонимный комментирует...

Обзор хороший. Только не тут уже старожили..
нет скажем новых проектов как qtiplot (похожая на origin под Win), исходники бесплатны. Еще есть SciDevis. Эти программы графические, что позволяет быстро мигрировать из Win.

jetxee комментирует...

qtiplot включу в следующую версию сравнения, scidevis гуглу неизвестен (а значит, и мне).

Anton комментирует...

Прошу прощения ошибся SciDAVis
сайт _scidavis.sourceforge.net_
Прошу так же добавить в ледующий обзор возможность использования с 0, для тех кто мигрирует с Виндов. Т.к. часть программ довольна сложна для использования (или установки), если нет опыта.

jetxee комментирует...

Я думал добавить параметр «простота использования», но честно говоря не знаю, как его оценивать.

Скажем, мне было нетрудно научиться рисовать простые графики в gnuplot, когда мне это впервые понадобилось, а вот в qtiplot мне отрисовать _свои_ данные пока не получилось... Потому что в каком формате ей подавать данные может быть и документировано, но сходу это не найти... А импортировать мои данные из текстового файла с помощью графического интерфейса не удалось.

Примерно так же не шибко эффективной была и попытка использования LabPlot.

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

Да, я посмотрел на сайт SciDavis. Пока что это форк qtiplot, причём очень недавний (версия 0.1.0). Думаю, пока что их включать в сравнительную таблицу рано: ещё неизвестно, что из этого проекта выйдет.

Да и с точки зрения пользователя-новичка, опять же, установить qtiplot или labplot, входящие в репозитории Debian можно одной коммандой/кликом мыши. SciDavis же пока в репозиторий никто не позаботился поместить...

Sergei комментирует...

а почему не R, у него приличная графика нескольких типов.

есть еще от ibm пакет визуализации очень мощный ?dc?

jetxee комментирует...

2Sergei:

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

Пакет dc (?) от IBM — это видимо, DX (data explorer). Он ныне известен как OpenDX. Я о нём упомянул. Пакет мощный, но ориентирован прежде всего на сложные многомерные визуализации. В данном сравнении рассматривались только средства визуализации 1D и 2D данных, которые делать в OpenDX можно, но на мой взгляд менее удобно.

Sergei комментирует...

вот вики с красивыми примерами графиков

http://wiki.r-project.org/rwiki/doku.php?id=graph_gallery:graph_gallery

oal комментирует...

Ну я вот не фига не статистик. Но для графиков усиленно использую GNU R.

pavel.mlnkv комментирует...

В гнуплоте имеется возможность ручного рисования векторного поля
http://gnuplot.sourceforge.net/demo_4.3/vector.html

Сергей комментирует...

Спасибо, Павел! Я поправил таблицу. В гнуплоте действительно неплохое отображение векторного поля (я даже сам им пользовался, но как-то упустил в обзоре).

Отправить комментарий