gnuplot шаг за шагом

Первый шаг
Итак. У нас есть данные, полученные в результате эксперимента. Скажем, вот такого вида:

1.0
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
5.5
5.5
5.5
5.5
5.5
5.5
5.5
5.5
6.0

Построить график? Что может быть проще! (При условии, что у нас есть gnuplot, установленный под Linux или Cygwin)

Данные сохраним в файл data1.txt и запустим gnuplot:

D:\MVB_Home\Development\Publication\gnuplot>gnuplot

        G N U P L O T
        Version 4.4 patchlevel 0
        last modified March 2010
        System: CYGWIN_NT-6.1 1.7.8(0.236/5/3)

        Copyright (C) 1986-1993, 1998, 2004, 2007-2010
        Thomas Williams, Colin Kelley and many others

        gnuplot home:     http://www.gnuplot.info
        faq, bugs, etc:   type "help seeking-assistance"
        immediate help:   type "help"
        plot window:      hit 'h'

Terminal type set to 'unknown'
gnuplot> set terminal jpeg size 640,480
Terminal type set to 'jpeg'
Options are 'nocrop font arial 12 size 640,480 '
gnuplot> set output "data_1.0.jpg"
gnuplot> plot "data1.txt"
gnuplot> exit

D:\MVB_Home\Development\Publication\gnuplot>


В файле data_1.0.jpg нас ждёт построенный график.

set terminal jpeg size 640,480

По умолчанию, gnuplot будет выводить график в окно x11 терминала. Эта команда заставит выводить картинку в формате jpeg.

set output "data_1.0.jpg"

Эта команда указывает в какой файл выводить.

plot "data1.txt"

Собственно, строим график.

exit

Выход из gnuplot

Всё просто, но не очень удобно.

Создаём комфортную среду
Согласитесь, не очень удобно каждый раз вводить однотипные команды.
gnuplot, как и любая уважающая себя GNU утилита, умеет читать сценарий своей работы.
Создаём текстовый файл и записываем туда все команды, которые нужно выполнить.
Имя этого файла передаём gnuplot как аргумент. Это самый простой работающий способ.

Для меня это не самый удобный путь. Обычно, перед тем как нарисовать график, например, преобразую данные с помощью скрипта на perl.

Есть простой способ вызова gnuplot из shell скрипта:

#!/bin/bash

# aditional data processing commands here.

gnuplot << EOP

set terminal jpeg size 640,480
set output "data_1.1.jpg"

plot "data1.txt" 

EOP

Результат работы этого скрипта такой же, как и в первом случае.

Вид графика
У нас крестики обозначают точки на графике. Нормальные люди рисуют линии :)
А мы чем хуже?

#!/bin/bash

gnuplot << EOP

set terminal jpeg size 640,480
set output "data_1.2.jpg"

plot "data1.txt" with lines

EOP

Разница только в этой строчке:

plot "data1.txt" with lines

Кроме линий существует ещё целая туча способов рисования. Гляньте ссылки в конце.
Результат будет таким:


Данные бывают разные
А что, если данные, которые нужно отобразить, устроены чуть сложнее?
Нет проблем! Например, у нас нет повторяющихся данных, зато есть время измерения:


0 1.0
1 1.5
2 2.0
3 2.5
4 3.0
5 3.5
6 4.0
7 4.5
8 5.0
9 5.5
#11 7
16 5.5
17 6.0

(Первая колонка — время в секундах, вторая — напряжение)

Строим график таким скриптом:


#!/bin/bash

gnuplot << EOP

datafile = "data2.txt"

set terminal jpeg size 640,480
set output "data_2.1.jpg"

plot datafile with lines

EOP


Результат будет такой же, как и в предыдущем случае :)

#11 7

Эта строчка в файле данных воспринимается как комментарий.

datafile = "data2.txt"

datafile — это имя переменной, и мы присвоили ей значение data2.txt.

plot datafile with lines

а здесь мы эту переменную использовали.

Много графиков
Два — это уже много :)
Хотим мы посмотреть ток и напряжение на одной временной шкале. Нет проблем!
Пусть данные будут такими:

0 1.0 0.5E1
1 1.5 0.4E1
2 2.0 0.3E1
3 2.5 0.2E1
4 3.0 0.1E1
5 3.5 0.9E0
6 4.0 0.8E0
7 4.5 0.7E0
8 5.0 0.6E0
9 5.5 0.5E0
16 5.5 0.5E0
17 6.0 0.4E0

Построим график таким скриптом:

#!/bin/bash

gnuplot << EOP

datafile = "data3.txt"

set terminal jpeg size 640,480
set output "data_3.1.jpg"

plot datafile with lines, \
     datafile using 1:3 with lines axes x1y2

EOP

И получим такой результат:



plot datafile with lines, \
     datafile using 1:3 with lines axes x1y2

gnuplot воспринимает это как одну строку. Первая часть использует умолчания и интерпретируется как:

datafile using 1:2 with lines

Вторая часть рисует второй график, используя ось X и вторую (правую) шкалу Y, беря данные из 1-й(время, x) и 3-й(ток, y2) колонок файла данных.

Рюшечки
Немного улучшим вид конечного продукта:

#!/bin/bash

gnuplot << EOP

datafile = "data3.txt"

set terminal jpeg font arial 8 size 640,480
set output "data_3.2.jpg"
set grid x y y2
set xlabel "Time(sec)"
set ylabel "Current(mA)"
set y2label "Voltage(V)"
set y2tics

plot datafile using 1:2 title "Current" with lines, \
     datafile using 1:3 title "Voltage" with lines axes x1y2

EOP


И получим такой график:


set terminal jpeg font arial 8 size 640,480

Сделаем шрифт чуть поменьше.

set grid x y y2

Нарисуем координатную сетку.


set xlabel "Time(sec)"
set ylabel "Current(mA)"

Надпишем, что обозначают оси X и левая Y.


set y2label "Voltage(V)"
set y2tics

Оформим правую ось Y.


plot datafile using 1:2 title "Current" with lines, \
     datafile using 1:3 title "Voltage" with lines axes x1y2

Напишем нормальную «легенду».

Что дальше?(ссылки)
  • Куча примеров с домашней странички gnuplot
  • Отличный сайт с разнообразными примерами
Вообще, gnuplot штука очень мощная. Может хоть глобус вращающийся нарисовать :)
Есть возможность построения математических функций, определение степени корреляции экспериментальных данных и заданой функции, работа в разных видах полярных и сферических координат, рисование псевдо 3D графиков и много чего ещё…

Отмазки
Данные, использованные для иллюстрации, взяты «с потолка». Мне нужен был небольшой, обозримый взглядом, набор данных…
Приведу реальный результат:

Файл данных занимал ~2 Mb — многовато для статьи. Здесь отображены, как экспериментальные данные, так и результаты фильтрации (SMA, EMA, WMA) с помощью самописных скриптов на perl.

P.S. На опечатки укажите, пожалуйста, глаз уже замылился — не вижу.
  • +6
  • 31 марта 2011, 19:28
  • mvb

Комментарии (44)

RSS свернуть / развернуть
excel/calc?
0
Это для виндузятников!!!111
-1
У каждого свои инструменты привычные для работы. У нас, один товарищ, дисковые массивы для UNIX серверов с помощью Excell администрит :)
Незнание тонкостей работы Excell я успешно заменяю работой с vi/sed/awk/gnuplot. Кому как удобней…
0
А чем плох Эксель?

В особо тяжелых случаях Маткад или матлаб?
0
Блин! Я ещё не публиковал это! Дописываю :) Excell плох тем что его тяжело подключать в автоматическом режеме к WWW серверу… Да и размер исполнимого файла Excell и gnuplot несколько разный :)
0
В догонку — попробуйте заставить этого монстра(Excell) поставить custom метки на шкале…
Ну например, в файле данных у нас 1400 в колонке времени, а на самом деле у нас это 1 минута 30 секунд с начала отсчёта.
Про MathCAD/MathLAB — они чуть больше чем дофига платные. А мне специфика работы не позволяетс с тыренным софтом работать. А поскольку я про вольные хлеба говорю — таких инструментов на все задачи не напокупаешься за свои, кровные…
0
А чем плох Эксель?
Автоматизация. Особенно в сочетании с линуксовым шеллом.
Эксель хорош, когда надо быстренько глянуть, что куда поехало (хотя это и в тексте сразу видно, если объём данных не большой). Или быстро запостить красивую картинку куда-нить…
+1
Позвольте с вами не согласиться по поводу «быстро». Скорее, зависит от навыков владения инструментом.
0
Смотря какой сложности график. Несложные быстро строятся.
0
Я не про скорость работы програмы :) На 32К строк данных gnuplot график мухой строит…
0
По скорости в этом плане у гуев подавляющее преимущество. Там, где в гуе незнакомой проги надо найти кнопку и расставить десяток галочек относительно прозрачного назначения — у консольной нужно скурить полмануала.
Консоль хороша для часто используемых программ, когда синтаксис помнишь наизусть, и для автоматизации.
Матлаб кстати в этом отношении не менее адов — для постройки графика на нем нужно написать программу :)
0
>Консоль хороша для часто используемых программ, когда синтаксис помнишь >наизусть, и для автоматизации.
Подписываюсь под каждым словом :)
0
А зачем использовать этих монстров, в которых чёрт ногу сломит, если есть простой и удобный инструмент, который легко прикручивается почти к чему угодно?
0
Затем, чтобы раз в год нарисовать график в чуть знакомой и стоящей с институтских времен проге, не вкуривая заново мануал забытого за год гнуплота)
А вот когда надо рисовать графики часто/много — тогда да, там уже начинается поиск подходящего инструмента, и гнуплот вполне может им оказаться.
0
Аффтар для примера набросил табличку на десятко значений, ну вот я и решил… Разумеется при большом количестве данных вгонять их в эксель уже можно рехнуться.
0
Ну почему. Достаточно открыть их как «файл с разделителями» или как-то так. А там можно достаточно гибко настроить формат файла.
0
Хоть я не люблю ексель но он не так уж и плох, так что даже мегабайтных размеров текстовики он хавает, но у него сдувает крыжу если боле 65353 строк в файле. Тоесть 65к точек это будет для екселя матюк.
Да и вообще, че все цепляются к екселю, на нем мир не заканчивается и есть много альтернатив.
Автор статьи привел замечательный пример, достойный здравого применения с использованием никсов, и главное в эмбедде где прыгает пингвин. Отличная статья.
Автору спасибо, хорошая статейка, жаль что не знаю как тут можно плюсануть его. ))
0
пардон, описка — 65535 строк ))
0
Пингвины не прыгают, они в холодильнике пиво стерегут.
0
не, в последнем вроде наконец-то починили, даже графики больше 32000 точек рисует
0
Для серьезного объема данных и мощных графиком используем Origin либо Statistica
0
А серьёзные это сколько и каких строк? А какие лицензии у этого софта?
0
Спасибо за неответ. Посмотрел домашние странички этих продуктов. Оба комерческие. Судя по тому что цену предлагают узнать у дистрибьютеров или направить им бланк заказа от имени организации — $100 тут не отделаешься… По моему опыту, такая картинка с ценами у софта стоимостью от $1K…
Следовательно, его имеет смысл использовать для _очень_ серьёзных задач.
0
У меня нет возможности следить за ответами так часто.
Используем эти 2 приложения при подготовке графиков для типографского вывода. Дипломы, статьи, диссертации. Мой соавтор больше любит статистику, мне больше по душе ориджин. Обрабатывали параметры траекторий метеороидов, объектов — космический мусор, объем данных очень большой. Миллионы строк по 20-30 столбцов.
Использовали в рамках научных работ университета, ПО использовалось либо в демо версии либо с **** («слово утки»), да простят нас разработчики.
0
Судя по картинкам на сайтах — програмки очень мощные. Рад за вас что у вас есть возможность использовать этот софт. Это не стёб. я, к сожалению, или к счастью, использовать «слово утки» не могу. Вынужден держать свою рабочую лошадку в лицензионной чистоте. Нелегко это, скажу я вам, в нашей старане… Соблазнов очень много…
0
Скажите, а у этих програм есть фильтрация данных (SMA/EMA, Kalman, ...)?
0
На этот счет не могу ответить, поскольку на столько глубоко не использовали их функционал
0
А почему графики в JPEG? Разве gnuplot не умеет PNG?
0
  • avatar
  • Vga
  • 31 марта 2011, 21:23
Умеет. Умеет и ещё кучу форматов. Даже буковками в текстовый файл может разпечатать (тип терминала dumb). А почему нужно было в PNG?
0
Ну, вообще-то, JPEG как-то не очень хорошо для графиков подходит по внутреннему устройству. Для этих целей лучше всё-таки gif или png.
0
Это особенности форматов, которые стоило бы знать. JPEG сжимает за счет размазывания мелких малоконтрастных деталей (т.е. срезая ВЧ-составляющие малой амплитуды). Здесь же вся картинка состоит из контрастных мелких деталей — ВЧ составляющие большой амплитуды. Мало того, что JPEG'у там нечего сжимать — он еше и режет их, размазывая картинку. PNG же как раз такие картинки жмет хорошо — он работает непосредственно с картинкой (а не ее спектром), сжимая ее словарным алгоритмом, который хорошо жмет повторяющиеся данные — в частности, большие монотонные поля. Плюс специальный препроцессинг, позволяющий за счет особенностей графической инфы увеличить монотонные участки — например, если несколько подряд идущих строк изображения одинаковы — PNG может закодировать только одну из них, а остальные превратятся в строки из одних нулей — которые очень эффективно сжимаются.
tl;dr — полутоновые фоточки следует скармливать жпегу, а малоцветные высококонтрастные и резкие картинки (графики, скриншоты, etc) — PNG.
+1
Спасибо. Не силён в обработке изображений. Очень толковое объяснение. Учту на будующее. Я, как то, решил что jpeg более родной формат для WWW (старые IE png не переваривали) вот и решил в этом формате вывести… Статью, пожалуй, переделывать не буду. Благо, картинки уже на сервер залиты и переделкой место не сэкономится а наоборот. А качество, на мой взгляд, и сейчас нормальное.
0
Нууу, приемлемое (возможно, за счет сжатия с высоким параметром Q). Но даже невооруженным глазом видно размазанность линий, а при увеличении — мусорные точки рядом с ними (эти особенности кстати не позволяют пересжать из JPEG и PNG — они в десятки раз снижают его эффективность). Куда хуже подписывать фоточки — в PNG они жмутся отвратительно, а JPEG превращает текст в говно (можно в моей статье про DSO201 посмотреть подписи к элементам на фото платы — до JPEG'а они были четкие и разборчивые).
Еще, чтобы оценить — можно преобразовать в спектр (БПФ) прямоугольный импульс, срезать хвост спектра (частоты выше той, где график спектра падает до 20-50% максимума), преобразовать обратно и оценить результат :)

Ну и старые IE врядли этот сайт переварят. Кроме того, есть GIF, и он даже уже лицензионно чист (хотя изначально открытый PNG мне больше по душе, да и технически намного лучше). Он работает очень похоже на PNG.
+1
Я продолжение разговора в личку завернул…
0
а вот и зря. нам же интересно)
0
Да, как-то, далековато от темы и сайта и статьи ушли…
0
Кстати, если интересно, для Линуксов есть «почти-аналог-Origin» — LabPlot
+1
Интересно. Буду посмотреть.
0
Есть еще интересная удобная прога называется GraphViz — www.graphviz.org/Gallery.php
она для визуализации — зависимостей/блок схем
0
хорошая программулина для одного графика в месяц))
0
  • avatar
  • gadz
  • 20 октября 2011, 22:16
Автор статьи молодец.
Замечательное и трезвое применение гнуплога. Побольше бы таких статей.
Порадовал с утра :) Спасибо.
Если есть еще примеры по применению в эмбеддеде с пингвином на борту — пишите, например я такое абажаю. ;)
0
А никто не подскажет, как вывести обычный линейный график из CSV, но данные там представлены в виде строк по 100 значений в каждой. Разделитель — запятые. То есть файл такого вида:
заголовок
0,1,2,3,4, ... ,99
100,101,102... ,199
200,201,202 ...

Тут и столбцы есть, и строки, хотя линия данных одна. Если предварительно заменить sed'ом запятую на перевод строки, т.е. получить файл вида
1
2
3
4
...

то проблем не возникает. Но хотелось бы скормить ему оригинальный файл, без трансформации.
Файл с осцилла, если что.
0
есть еще UDAV и mathGL, если что.
0
у гнуплота есть еще очень замечательная фича что с ним через pipe можно работать.
соответственно очень просто прикручивается к своей программе
для отладки очень удобно, сразу смотреть данные на картинке в реальном времени, а не копировать каждый раз в эксель чтобы график построить.

codepad.org/lCAhyGK8


#include "gnuplot.h"
double x[];
double y[];
int num;

gnuplot g;
g.plot(x,y,num);
0
  • avatar
  • _pv
  • 23 мая 2013, 00:06
Может кому интересно будет — к excel есть библиотека работы с ком портом, можно подключить его напрямую к контроллеру и делать все что угодно — закружать данные в контроллер, рисовать графики и тд через визуал васик.
Ссылка
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.