Gnuplot на домашней страничке
Зачем?
При разработке доступной онлайн базы данных для хранения результатов расчётов возникло непреодолимое желание представлять информацию не только в табличном виде, но и в виде графиков. Можно пойти различными путями, например, рисовать кривые в PHP, но правильнее (в смысле UNIX-way) будет использовать внешнюю программу, уже умеющую строить графики, такую как Gnuplot.
Особенно интригует возможность вывода графиков в виде набора JS комманд для рисования на HTML5-холсте (canvas), чем мы и займёмся.
О Gnuplot много писали, в том числе и на Хабре (1, 2), поэтому нет необходимости в подробном описании его синтаксиса.
К своему удивлению, я не обнаружил хорошего туториала о том, как связать вывод gnuplot с динамически формируемой страничкой. Возможно, это связано с недостатком знаний о Java Script и на самом деле всё очевидно, но тем не менее, есть надежда, что эта статья окажется полезной.
Вывод Gnuplot в HTML5 Canvas
Чтобы получить представления о возможностях такого режима, составим минимальный скрипт, рисующий кусок синусоиды в файле output.html:
Здесь первая строка задает интерпретатор команд, вторая — устанавливает формат вывода canvas. Для особо удачных графиков здесь можно было бы заменить canvas на pdf и сразу вставить результат в статью для, скажем, Nature. Третья строка указывает имя файла для записи, если ее не будет — то поток будет направлен в stdout, чем мы воспользуемся при генерации html-странички. Последняя строка содержит собственно команду для построения графика синуса.
Открыв сгенерированный файл output.html, можно увидеть график:
Хорошо, но такой результат вполне можно было бы получить, вставляя рисунки, полученные и терминалом png, а хотелось бы интерактивности! Для этого нужно всего лишь указать параметры терминала enhanced mousing:
В результате появится панелька с управляющими кнопками, возможность ставить точки и приближать интересующую область:
Уже больше похоже на примеры с сайта разработчиков, но с удаленного компьютера работать не будет, поскольку за вспомогательными JS-скриптами идет обращение в локальную файловую систему, так как сгенерированный файл содержит строки типа:
То есть, нужно разместить файлы из /usr/share/gnuplot/gnuplot/4.6/js на своем сайте, скопировав их или создав ссылку. Для работы достаточно иметь файлы canvastext.js, gnuplot_common.js, gnuplot_mouse.js, gnuplot_mouse.css и png-иконки. Также необходимо указать путь к этим файлам в параметрах терминала:
Взаимодействие PHP и gnuplot
Итак, есть путь к папке расчётов, нужно построить график согласно выбранным пунктам на html-страничке.
Разобьем задачу на несколько частей, как показано на диаграмме:
PHP/HTML
html-форма и php-скрипт объединены в один файл plot_calc.php:
Как заметили в комментариях, вызов shell_exec в таком виде является опасной затеей, так что следует, как минимум, провести фильтрацию данных с помощью функции filter_input.
SHELL
Задача скрипта plot_calc.sh — формирование команд для gnuplot согласно заданным внешним параметрам. Скрипт создает файл во временной директории /tmp, содержимое которого передается gnuplot, а результат выполнения возвращается обратно, где его уже ждет php-скрипт.
Этому файлу потребуются права на исполнение:
Gnuplot
Скрипт оболочки формирует выходной файл в имени которого содержится имя вызвавшего скрипта и случайное число, внутренность у него примерно такая:
Проверить работу можно направив браузер по адресу http://servername/plot_calc.php?path=GoodCalc&nsites=10.
В результате появится возможность построить графики по данным файлов prob.res и Energy.res, и должна получиться страничка, похожая на:
Генерируемые файлы в /tmp надо время от времени подчищать, для этого сгодится задание cron (от root’а):
gnuplot шаг за шагом
Первый шаг
Итак. У нас есть данные, полученные в результате эксперимента. Скажем, вот такого вида:
Построить график? Что может быть проще! (При условии, что у нас есть gnuplot, установленный под Linux или Cygwin)
Данные сохраним в файл data1.txt и запустим gnuplot:
В файле data_1.0.jpg нас ждёт построенный график.
По умолчанию, gnuplot будет выводить график в окно x11 терминала. Эта команда заставит выводить картинку в формате jpeg.
Эта команда указывает в какой файл выводить.
Собственно, строим график.
Всё просто, но не очень удобно.
Создаём комфортную среду
Согласитесь, не очень удобно каждый раз вводить однотипные команды.
gnuplot, как и любая уважающая себя GNU утилита, умеет читать сценарий своей работы.
Создаём текстовый файл и записываем туда все команды, которые нужно выполнить.
Имя этого файла передаём gnuplot как аргумент. Это самый простой работающий способ.
Для меня это не самый удобный путь. Обычно, перед тем как нарисовать график, например, преобразую данные с помощью скрипта на perl.
Есть простой способ вызова gnuplot из shell скрипта:
Результат работы этого скрипта такой же, как и в первом случае.
Вид графика
У нас крестики обозначают точки на графике. Нормальные люди рисуют линии 🙂
А мы чем хуже?
Разница только в этой строчке:
Кроме линий существует ещё целая туча способов рисования. Гляньте ссылки в конце.
Результат будет таким:
Данные бывают разные
А что, если данные, которые нужно отобразить, устроены чуть сложнее?
Нет проблем! Например, у нас нет повторяющихся данных, зато есть время измерения:
(Первая колонка — время в секундах, вторая — напряжение)
Строим график таким скриптом:
Результат будет такой же, как и в предыдущем случае 🙂
Эта строчка в файле данных воспринимается как комментарий.
datafile — это имя переменной, и мы присвоили ей значение data2.txt.
а здесь мы эту переменную использовали.
Много графиков
Два — это уже много 🙂
Хотим мы посмотреть ток и напряжение на одной временной шкале. Нет проблем!
Пусть данные будут такими:
Построим график таким скриптом:
И получим такой результат:
gnuplot воспринимает это как одну строку. Первая часть использует умолчания и интерпретируется как:
Вторая часть рисует второй график, используя ось X и вторую (правую) шкалу Y, беря данные из 1-й(время, x) и 3-й(ток, y2) колонок файла данных.
Рюшечки
Немного улучшим вид конечного продукта:
И получим такой график:
Сделаем шрифт чуть поменьше.
Нарисуем координатную сетку.
Надпишем, что обозначают оси X и левая Y.
Оформим правую ось Y.
Напишем нормальную «легенду».
Что дальше?(ссылки)
Отмазки
2 Mb — многовато для статьи. Здесь отображены, как экспериментальные данные, так и результаты фильтрации (SMA, EMA, WMA) с помощью самописных скриптов на perl.
P.S. На опечатки укажите, пожалуйста, глаз уже замылился — не вижу.
Комментарии ( 44 )
В особо тяжелых случаях Маткад или матлаб?
Нууу, приемлемое (возможно, за счет сжатия с высоким параметром Q). Но даже невооруженным глазом видно размазанность линий, а при увеличении — мусорные точки рядом с ними (эти особенности кстати не позволяют пересжать из JPEG и PNG — они в десятки раз снижают его эффективность). Куда хуже подписывать фоточки — в PNG они жмутся отвратительно, а JPEG превращает текст в говно (можно в моей статье про DSO201 посмотреть подписи к элементам на фото платы — до JPEG’а они были четкие и разборчивые).
Еще, чтобы оценить — можно преобразовать в спектр (БПФ) прямоугольный импульс, срезать хвост спектра (частоты выше той, где график спектра падает до 20-50% максимума), преобразовать обратно и оценить результат 🙂
Ну и старые IE врядли этот сайт переварят. Кроме того, есть GIF, и он даже уже лицензионно чист (хотя изначально открытый PNG мне больше по душе, да и технически намного лучше). Он работает очень похоже на PNG.
Gnuplot и с чем его едят
Почему именно gnuplot?
График из поста про генератор случайных чисел
Картинка из поста про speetest модемов
Графики простые и классные. Наиболее ценное преимущество gnuplot заключается в том, что для их построения вам нужен только текстовый файл с исходными данными, gnuplot на вашей любимой ОС (хоть OpenWRT) и любимый тестовый редактор vim.
На первый взгляд может показаться, что gnuplot сложнее в использовании для построения графиков чем MS Exel. Но это только так кажется, порог вхождения чуть выше (это вам не мышкой наклацать, тут надо документацию читать), но на практике выходит намного проще и удобнее. Один раз написал скрипт и используешь его всю жизнь. Мне реально намного сложнее построить график в Exel, где всё не логично, нежели в gnuplot. А главное преимущество gnuplot, то что его можно встраивать в свои программы и на ходу визуализировать данные. Так же gnuplot без особых проблем строит график с 30-ти гигабайтового файла статистических данных, тогда как Exel просто падал и не мог его открыть.
К плюсам gnuplot можно отнести то, что он легко интегрируется в код на стандартных языках программирования. Есть готовые библиотеки для многих языков, лично я сталкивался с php и python. Таким образом можно генерировать графики прямо из своей программы.
Для примера скажу, что моя хорошая подруга, когда писала диссертацию освоила gnuplot (с моей подачи). Она ни разу не технарь, но разобралась за один вечер. После чего строила графики только там, и уровень её работы стал выгодно отличаться на фоне коллег, использующих Excel. Лично для меня показателем высокого качества научной работы являются графики, построенные специализированными программами.
Таким образом, gnuplot — это просто, доступно и красиво. Едем дальше.
Gnuplot — применение
Работа с gnuplot возможна двумя способами: командный режим и режим выполнения скриптов. Рекомендую сразу использовать второй режим, как наиболее удобный и быстрый. Тем более, что функционал абсолютно тот же.
Но для старта погоняем gnuplot в командном режиме. Запускаем gnuplot из командной строки, либо тем способом который доступен для вашей ОС. Обучение можно начать даже не с чтения этой статьи, а прямо с самой первой команды help. Она выведет шикарную справку и дальше по ней можно идти. Но мы пробежимся по основным моментам.
График строится командой plot. В качестве параметров команды можно задать функцию, либо имя файла данных. А так же какой столбец данных использовать и чем соединять точки, как их обозначать и т.д. Давайте проиллюстрирую.
После выполнения команды у нас откроется окно, где будет график синуса, с подписями по умолчанию. Давайте улучшим этот график, заодно разберёмся с дополнительными опциями.
Подпишем оси.
Задает подпись для оси абсцисс.
Задает подпись для оси ординат.
Добавим сетку, чтобы было видно где построен график.
Мне не нравится, что по оси ординат синусоида упирается в конец графика, поэтому зададим лимиты значений, которыми будет ограничен график.
Надо бы добавить заголовок к нашему графику, чтобы всё по феншую было.
Обратите внимание, что можно задавать шрифты и их размер. Какие шрифты можно использовать, смотрите в документации на gnuplot.
Ну и наконец, давайте кроме синуса на графике ещё нарисуем и косинус, да ещё и зададим тип линии и её цвет. А так же добавим легенды, что же мы чертим.
Здесь мы рисуем два графика на одном холсте, красным и зелёным цветом. Вообще вариантов линий (пунктир, штрих, сплошная), тощин линий, цветов великое множество. Как и типов точек. Моя цель лишь продемонстрировать спектр возможностей. Сведём все команды в одну кучку и выполним их последовательно. Чтобы сбросить предыдущие настройки, введём reset.
В результате получаем вот такую красоту.
График уже не стыдно публиковать в научном журнале.
Если вы повторяли честно всё это за мной, то могли заметить, что вручную каждый раз вводить это, даже копируя, как-то не комильфо. Но это же готовый скрипт? Так давайте же его и сделаем!
Выходим из командного режима, командой exit и создаём файл:
Делаем его исполняемым и запускаем. Ну не забываем как выйти из vim.
В результате получаем такое же окно с графиками. Если в заголовке не добавить “-persist”, то окно автоматически закроется после выполнения скрипта.
Но окно создавать часто не очень нужно, плюс не всегда удобно им пользоваться, да и вы можете работать в операционной системе без GUI. Значительно чаще нужно получать графические файлы. Лично я предпочитаю векторный формат postscript, так как при большом количестве точек можно приближать различные участки графика, без потери качества. И так же просмотрщик в линуксе автоматически обновляет окно с графиком, при изменении файла postscript, что тоже весьма удобно.
Для того, чтобы вывести данные в файл, а не на экран, надо переназначить терминал.
Как не трудно догадаться, указываем тип файла, его разрешение, затем указываем имя файла. Добавляем эти две строки в начало нашего скрипта, и получаем эту картинку в текущей папке.
Для того, чтобы сохранять в postscript нужно использовать следующие команды:
Реальные данные
Синусы, косинусы рисовать конечно прикольно, но всё же реальные данные рисовать намного интереснее! Напомню недавнюю задачу, о которой писал статью — вывод графиков скорости интернета за длительные промежутки времени. Формат данных там был следующий.
Operator; #Test; Date; Time; Coordinates; Download Mb/s; Upload Mb/s; ping; Testserver
Rostelecom;0;21.05.2020;09:56:00;NA, NA;3.7877656948451692;5.231226008184113;132.227;MaximaTelecom (Moscow) [0.12 km]: 132.227 ms
Rostelecom;1;21.05.2020;10:01:02;NA, NA;5.274994541394363;5.1088572634075815;127.52;MaximaTelecom (Moscow) [0.12 km]: 127.52 ms
Rostelecom;2;21.05.2020;10:04:35;NA, NA;3.61044819424076;4.624132180211938;135.456;MaximaTelecom (Moscow) [0.12 km]: 135.456 ms
Видно, что разделителем у нас служит точка с запятой, нам нужно вывести скорость загрузки, скорость выгрузки в зависимости от времени. При этом, если обратить внимание дата и время находятся в разных столбцах. Сейчас расскажу, как я это обошёл. Сразу приведу скрипт, по которому строился график.
В начале файла мы задаём выходной файл postscript (либо png, если будет нужен).
set datafile separator ‘;’ — мы задаём символ разделитель. По умолчанию столбцы разделяет пробел, но csv-файл предлагает множество вариантов разделителей, и нужно уметь использовать все.
set grid xtics ytics — устанавливаем сетку (можно сетку установить только по одной оси).
set xdata time — это важный момент, мы говорим о том, что по оси X формат данных будет время.
set timefmt ‘%d.%m.%Y;%H:%M:%S‘ — задаём формат данных времени. Обратите внимание, что в формат времени попал символ разделения столбцов(«;»), таким образом мы обработаем две колонки как одну.
Задаём подписи осей и графика. После чего строим график.
plot «Rostelecom.csv» using 3:6 with lines title «Download», » using 3:7 with lines title «Upload» — на одном графике мы строим как скорость скачивания, так и скорость отдачи. Using 3:6 — это номер столбца в нашем файле исходных данных, что от чего строим (X:Y).
Далее так же точно строим график для пинга. Результирующий график будет выглядеть следующим образом.
Это скриншот с postscript. Прямые линии в графике связанны с тем, что там пропуски данных. Вот вполне реальный пример построения графика.
Вы хотите 3D? Их есть у меня!
Долго думал, какой же пример трёхмерного графика привести, и не придумал ничего лучше, чем визуализировать картинку. Ведь по сути картинка — это трёхмерный график, где яркость пикселя — это координата по z. Поэтому давайте немного похулиганим.
Возьмём самое знаменитое фото Эйнштейна.
И сделаем из него график. Для этого конвертнём его в формат pgm ASCII и выкинем все пробелы, заменив переводом строки, такой простой командой.
Кто не понял, что здесь происходит, поясняю: мы конвертируем с помощью imagemagic картинку в формат pgm, а потом с помощью tr заменяем перевод каретки с переносом на новую строку на пробел, а потом все пробелы на перенос каретки и сохраняем это всё в outfile.pgm. Кому это сложно, могут открыть файл в gimp и экспортировать его как pgm-ASCII.
После чего открываем получившийся файл нашим любимым редактором vim и удаляем у него заголовок. В моём случае это первые три строки. Из заголовка не забываем узнать разрешение файла, в данном случае было 325х408 пикселей. Всё, мы получили текстовый файл координат Z! Теперь наша задача добавить координаты X и Y, для этого прогоним всё это через питоновский скрипт.
Сохраняем это как convert.py и запускаем:
Всё, у нас теперь res.txt содержит координаты Эйнштейна… Хм, ну точнее сказать координаты его изображения. Ну в общем, вы поняли :).
…
406 317 60
406 318 54
406 319 30
406 320 41
406 321 84
406 322 101
406 323 112
406 324 119
407 0 128
407 1 53
407 2 89
407 3 95
407 4 87
.
Скрипт для построения этой красоты выглядит следующим образом.
Прежде чем мы пойдём разбирать скрипт, если вы будете это повторять, то настоятельно рекомендую выполнить строки скрипта в командном режиме, чтобы можно было мышкой вращать график (разумеется не указывая set terminal). Это очень круто!
Вначале мы устанавливаем тип выходных данных, а так же границы данных. Границы выставлены по размерам картинки, и плюс от низа я отступил по оси Z на 256 символов, чтобы была видна проекция картинки. Дальше мы озаглавливаем график, подписываем оси. Командой unset key — я отключаю легенды (она не нужна на графике). А вот далее идёт настоящая магия!
set palette gray — мы задаём палитру. Если оставить по умолчанию, то график будет цветным, как на тепловизоре. Чем выше, тем более жёлтое пятно, чем ниже тем темнее красный цвет.
set hidden3d — как бы натягивает изогнутую поверхность (удаляет линии), таким образом формируется красивая выпуклая повехность.
set pm3d at bs — включаем стиль рисования трёхмерный данных, который рисует данные с координатой сеткой и цветом. Подробнее читайте в документации, более детальное описание выходит за рамки статьи.
set dgrid3d 100,100 qnorm 2 — устанавливаем размер ячеек сетки 100х100, и сглаживание между ячейками. Значение 100х100 и так очень большое, и программа сильно тормозит. qnorm 2 — это сглаживание (интерполяция данных между ячейками).
splot «./res.txt» with l — рисуем получившийся график. «With l» — означает рисовать график линиями. Это мелкий хак, потому что точки видны на графике (можно задать маленькие точки).
После запуска ждём некоторое время, и получаем полигональный «барельеф». Попробуйте поэкспериментировать с настройками, чтобы получить другие варианты визуализации.
Изображение в командном режиме, после того как повращали.
Тут вспоминается сразу анекдот.
Как найти площадь Ленина?
Только необразованный человек ответит на этот вопрос, что нужно высоту Ленина умножить на ширину Ленина.
Образованный человек знает, что нужно взять интеграл по поверхности.
Применение gnuplot в своих программах
Пример взят со stackoverflow с моими небольшими доработками.
Код генерирует текстовый файл и постоянно вызывает перестроение графика. Код приложу под спойлер, чтобы не рвать статью.
Код работает очень просто, мы открываем pipe:
Это аналогично вертикальной черте в bash, когда мы за одной командой пишем другую, только внутри программы. Пишем данные в файл lorenzgplot.dat. Один раз вызываем в gnuplot команду splot:
И далее при добавлении новой точки, мы перестраиваем график.
В результате получаем очень красивое медленное построение Аттрактора Лоренца. Ниже видео, снятое почти десять лет назад, на старенький фотоаппарат, поэтому не ругайтесь сильно. Важно в видео другое, что всё это прекрасно работает на таком старом железе, как Nokia N800. Смотреть это желательно без звука.
Важно понимать, что команда replot очень хорошо кушает память и процессорное время, то есть, вот такое построение графика некисло так подтормаживает систему. Так что, при всей любви к gnuplot — это не лучший способ его использования. Ещё одна проблема, что данное окно не удастся ни закрыть, ни передвинуть.
Заключение
Напоследок хочу показать видео, в котором я собрал сотни графиков случайного логарифмического распределения регистраций радиоактивных частиц, реальные данные одного исследования. Видео можно и нужно смотреть со звуком.
В этой статье не смог рассказать и тысячной доли возможностей данного графопостроителя, разве что немного ознакомил читателя с данной программой. Далее вам следует самостоятельно искать примеры, читать документацию на официальном сайте gnuplot.sourceforge.net либо www.gnuplot.info. Обязательно загляните в примеры, там очень много интересного и полезного.
Для старта так же могу порекомендовать Краткое введение в gnuplot (рус). Искренне удивлён, что такая замечательная программа не изучается во всех технических ВУЗах наравне с Latex. У нас зачем-то учили MS Exel и Word.
Изучить gnuplot не сложно, я потратил буквально несколько дней в попытке разобраться с нуля. Но с данной статьёй, верю, что у вас всё будет быстрее. Теперь я забыл о всяких Exel/Calc в качестве графопостроителей, использую только гнуплот. Тем более, что я даже не знаю и десятой доли всех возможностей построения графиков.
Хочу отметить, что существуют множество других графопостроителей, не хуже, чем гнуплот, тем более, что он достаточно старый. Но для меня gnuplot оказался наиболее простым и исчерпывающим. Плюс он самый распространённый графопостроитель, и в сети громадное количество примеров его использования. Спасибо что дочитали!
Записки дебианщика
В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.
Создание графиков в gnuplot: пример построения графика
Согласно официальной документации, gnuplot имеет интерактивный и поточный режим. В интерактивном режиме вы вводите команду за командой, задавая параметры строительства графика. Для изучения возможностей или чтобы построить единственный график это, наверное, нужно, но обычно проще написать скрипт и скармливать его гнуплоту. Об этом далее.
Как в gnuplot построить график
Gnuplot использует скриптовой язык, который описывает строительство графика функции или рядов данных. В скрипте задаются параметры графика: шрифты осей, пределы по осям, расположение легенды. После этого скрипт передаётся по конвейеру гнуплоту, и он выдаст файл PostScript, который и содержит график.
Небольшой пример. Имеются ряды данных в обычном текстовом файле, нужно построить график. Вот исходные данные, файл RAWSTDmeasurementresult
1.6593991e+00 1.6523134e+00 1.6407763e+00
1.8986703e+00 1.8667678e+00 1.8595763e+00
2.6304331e+00 2.5340401e+00 2.4999678e+00
4.2843754e+00 4.0227936e+00 4.0423230e+00
7.6136102e+00 7.0438436e+00 7.1057056e+00
/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps»
set xlabel «ISO number» font «Helvetica,18»
set bmargin 4
set ylabel «Pixels standard deviation» font «Helvetica,18»
set yrange [0:50]
set key top left
set xtics («100″ 0,»200″ 1,»400″ 2,»800″ 3,»1600» 4)
set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
plot «
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using 1 title «RAW data, Red channel» with linespoints linestyle 1,»
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using 2 title «RAW data, Green channel» with linespoints linestyle 3,»
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using 3 title «RAW data, Blue channel» with linespoints linestyle 2
Ничего сложного в этом нет, сейчас я эти иероглифы прокомментирую.
Пример скрипта построения графика на gnuplot с пояснениями
Итак, разбираем скрипт.
/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps»
Это путь к будущему графику и имя графика. Можно сваливать их в текущий каталог или куда захотите.
set xlabel «ISO number» font «Helvetica,18»
Подпись по оси Х будет «ISO number», шрифтом Helvetica и размером 18 пунктов.
set bmargin 4
Устанавливаем нижнее поле равное 4 относительным единицам, чтобы не обрезалась подпись к оси Х (этот досадный косяк имеет место быть у меня, у вас его может и не быть).
set ylabel «Pixels standard deviation» font «Helvetica,18»
Подпись по оси Y будет » Pixels standard deviation «, шрифтом догадайтесь каким 🙂
set yrange [0:50]
Пределы по оси Y составляют от 0 до 50.
set key top left
Легенда (обозначение рядов данных) сверху слева.
set xtics («100″ 0,»200″ 1,»400″ 2,»800″ 3,»1600» 4)
Отсчёты по оси Х будут 100, 200, 400 800 и 1600.
set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
Здесь задаётся номер линии (чтобы на неё сослаться при построении конкретного ряда данных), тип линии и тип точки (квадратик, кружочек, ромбик. ).
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using
1 title «RAW data, Red channel» with linespoints linestyle
1,
«
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using 2
title «RAW data, Green channel» with linespoints linestyle
3,
«
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using 3
title «RAW data, Blue channel» with linespoints linestyle 2
Вся эта конструкция предписывает строить график, который будет состоять из трёх линий (типа 1, 2 и 3). График строится по данным, которые лежат в одном текстовом файле тут:
Для каждой ветви графика задаётся свой стиль линии.
Вот, кстати, почему и зачем у меня появился в своё время пост о вертикальной конкатенации: мне нужно было добавить в файл данных ещё один ряд, полученный при других измерениях. После этого можно скармливать новый файл данных гнуплоту и он будет воспринимать это как новый ряд.
Следует отметить, что, вопреки распространённому заблуждению, gnuplot выдаёт графики с publication-ready качеством, которые без вопросов принимаются в любом зарубежном (и уж тем более местном) научном журнале. Например, NASA с помощью gnuplot создаёт карты погоды, а некоторые математические системы (типа MATLAB) просто используют куски кода gnuplot чтобы отрисовывать графики. Так что график, который выдаст гнуплот, в любом случае на порядок краше того, на что способен ексель или Openoffice.org Calc.
28 комментариев: |высказаться!| RSS-лента дискуссии.|
Как всегда четкое руководство к действию, спасибо.
Я даже жалею что мне построение графиков никаким боком как программисту и не студенту ненужно, очень люблю применять такие гикнутые штучки на практике.
2 Michael пишет.
В приведённом скрипте два раза встречаются set yrange и set key. Первый из вариантов можно убрать.
У меня часто эти значения переопределяются в зависимости от графиков. Взял рабочий экземпляр. Но для наглядности ущербно, согласен, поправил, спасибо.
Я просто делаю постобработку рисунка таким скриптом
Спасибо, обязательно попробую!
2 vyazovoi пишет.
Как всегда четкое руководство к действию, спасибо.
Я ж обещал про гнуплот написать 🙂
На самом деле, я таким образом заставил себя прочитать к нему документацию. И мне это очень помогло.
Бордер ставлю только снизу, иначе подписи обрезаются. Другого способа не знаю. Твой код попробую.
В первом посте ошибся, имел в виду bmargin.
Кстати, какой версией гнуплота пользуетесь?
для того чтобы не повторять имя файла несколько раз можно писать так
/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult» using
1 title «RAW data, Red channel» with linespoints linestyle 1,
» u 2 t «RAW data, Green channel» with linespoints linestyle 3,
» u 3 t «RAW data, Blue channel» with linespoints linestyle 2
2 Michael пишет.
В первом посте ошибся, имел в виду bmargin.
Я так и понял. Нашёл такой финт по другому поводу, и решил применить у себя, т.к. задолбало обрезание подписей снизу.
Немного о том, как работают эти самые margin’ы.
Спасибо, интересно. Не возражаешь, если включу фрагменты этого ответа в пост?
В вашем случае, неправильное определение границ связано, по-видимому, с тем, что гнуплот рассчитывает значение поля исходя из дефолтного размера шрифта (14, вроде бы), а не явно указанного вами 18.
Ко мне лучше на «ты», а то чувствую себя академиком с тросточкой 🙂
Насчёт шрифта: странно, что гнуплот не учитывает тот шрифт, что я явно указываю.
BoudingBox легко поправить руками или предложенным скриптом.
Только скрипты: у меня счёт графикам идёт на десятки и сотни.
Кстати, какой версией гнуплота пользуетесь?
Той, что в etch. У меня кодировка КОИ8, мне большего и не надо.
2 Анонимный Анонимный пишет.
для того чтобы не повторять имя файла несколько раз можно писать так
О, спасибо, надо будет применить!
Спасибо, интересно. Не возражаешь, если включу фрагменты этого ответа в пост?
Включай, конечно.
Ко мне лучше на «ты», а то чувствую себя академиком с тросточкой 🙂
Понял 🙂
Как я понял, по умолчаию все графики (рисунки) получаются одного размера 127 x 89 мм (кажется так, точно не помню).
Вопрос: Можно ли задать другой размер рисунка? Если да, то как?
Вопрос снят, разобрался. Спасибо
А как насчет логарифмических осей? и чтобы засечки на осях корректно отображались?
Можно ли текст писать разным шрифтом в одной метке (label)? Например, одну букву выделить курсивом.
>> set key top left
>> Легенда (обозначение рядов данных) сверху справа.
@gummybear117 комментирует.
Может кому ещё пригодится.
А как же! Спасибо, Медведь, что поделился. Когда у автора будет чуток больше времени, он это запузырит в пост.
@zhevak комментирует.
Найдена описка:
О, точно! Как же я это. Спасибо, исправлено!
У меня назрел вопрос, что-то не могу найти на него найти ответ. Как сделать так, чтобы окно гнуплота не закрывалось после отработки скрипта.
Поясню, в чём заключается вопрос. Я хочу сделать динамическое отображение графика на экране, т.е. последовательно скармливать гнуплоту разные файлы данных, и чтобы он менял картинку. Но после отработки скрипта, он закрывает окно.
pause 1 не очень подходит для этого, т.к. внешняя программа (или скрипт) не знает, что у гнуплота стоит пауза, и продолжает слать комманды. Можете что-нибудь порекомендовать?
Долгий ответ: можно попробовать воспользоваться командами multiplot и replot. Можно ещё спросить у автора этого ресурса, он вообще большой дока по гнуплоту.
Поясню, в чём заключается вопрос. Я хочу сделать динамическое отображение графика на экране, т.е. последовательно скармливать гнуплоту разные файлы данных, и чтобы он менял картинку.
Есть костылястое решение: делать графики с последовательными именами в PNG для разных данных, а потом склеить в видеопоследовательность. Я так делаю иллюстрации динамического поведения деформируемых зеркал в своём симуляторе.
И да, отпишитесь, если найдёте решение. Автору тоже интересно.
Всё же гнуплот очень мощная штука для построения графиков. Я нашёл два интересных решения. Первое в виде скрипта, второе програмное. Они идеологически похожи, но и немного различаются.
И выполняем гнуплотовский скрипт:
#!/usr/bin/gnuplot
plot «random.dat» ps 0.5 pt 7
pause 1
replot
reread
Он будет бесконечно обновляться раз в секунду.
Этот вариант не очень удобен при использовании в программе, т.к. хочется осуществлять обновление по нужде и прекращать работу построения графиков.
Работа из си-программы http://stackoverflow.com/questions/9403474/gnuplot-and-usleep-on-c
Я не буду тут постить весь код, но обращу внимание, что чтобы окно гнуплота не закрывалось, как мне кажется, его надо запустить с параметром «-«, как здесь
usleep(100000);//задержка
fprintf(gp, «replot \n»);//перерисовка
Я даже попробовал перенести эту программу на Nokia n800, работает почти без нареканий. Можно поглядеть тут: http://dlinyj.livejournal.com/577579.html
З.Ы. Специально подробно написал, мало ли кому будет полезно. Возможно стоит это оформить отдельным постом в данном блоге.
При этом файл botva.eps открыт в Evince, который сам перезагружает его содержимое после изменения.
Я так и делал, но это происходит достаточно медленно. В особенности если точек очень много (больше 10 000). По этому хотелось иметь сразу возможность делать это средствами гнуплота.
Плюс, задача использовать это на n800, т.к. она будет обрабатывать экспериментальные данные на лету.
@Igor Voronin комментирует.
Тем не менее, есть приложение для андроида, которое может строить и просматривать графики Гнуплота. Я не использовал пока что.
Вы совершенно не правы. Давно на андройде используется как octave, так и gnuplot http://habrahabr.ru/post/168411/
Я же не говорю, что это 100% альтернатива. Другое дело, что в дороге приходит гениальная мысль и её можно легко проверить, достав из широких штанин свой телефон. Да и потом, я постоянно с собой планшет таскаю, а там уже далеко не 4 дюйма.