0. Преамбула
Gnuplot умеет интерактивно строить графики, беря данные из файла, а также умеет эти графики пихать в файлы картинок любого формата ( особено png =) ). Так же он умеет строить сразу несколько графиков на одном полотне.
Файл данных графика можно формировать разными способами, однако удобнее всего для наших задач файл сформировать в следующем виде:
data.log
# index U[index] exact_U[index]
0 1.0 1.0
0.2 1.1 1.09
0.4 1.2 1.18
0.6 1.3 1.35
0.8 1.1 1.13
1 1.05 1.05
# end of log file
- первый столбец — это координата x (может быть время, может быть x(наш случай))
- второй столбец — это значение нашего решения в точке x (в нашем случае T = 1)
- третий столбец — это значение данного точного решения в той же точке
- # — любая строка, начинающаяся с символа # — это комментарий. игнорируется gnuplot’ом при построении графиков
При построение графиков по данному файлу, мы получим два графика (по умолчанию один красный, другой зеленый) построенного по данным точкам, где по оси абцис будут отложены данные с первого столбца. Каждый график будет состоять из отрезков, соединяющие данные точки.
1. Подготовка данных
Пусть U — это массив значений приближенного решения на данном слое (в частности, в конце, перед выходом из программы U[j] = U(T, h*j))
Пусть exact_U(t, x) — это функция точного решения. Мы будем смотреть на значения exact_U(T, h*j).
Перед выходом из программы необходимо распечатать в файл следующие данные: x, U, exact_U.
На С++ это будет выглядеть так (не забудьте подключить fstream: #include ):
main.cpp
Итак, data.log — сгенерированный файл данных. Его надо положить рядом с файлом gnuplot.exe, чтобы его было проще вызывать.
2.Построение графиков
Запускаем командную строку, переходим в папку с gnuplot.exe и запускаем его:
пуск->выполнить->cmd.exe
> D:
> cd programs\gnuplot\
> gnuplot.exe
На что получаем приглашение gnuplot и его милое приветствие =)
Далее все просто — просим построить графики:
gnuplot > plot ‘data.log’ u 1:2 w linesp, ‘data.log’ u 1:3 w linesp
- plot — просим строить 2x-мерный график (можно и 3x-мерные строить с помощью splot)
- ‘data.log’ — файл с данными
- u 1:2 == usage 1:2 — строить график по точкам из первого и второго столбца, где первый столбец — OX, второй — OY
- w linesp == with linesp — точки графика соединять отрезками
gnuplot > plot ‘data.log’
gnuplot будет откладывать все точки слева направо по принципу (i, y_i), где i — номер вхождения точки.
3. Управление интерактивной средой
- правая кнопка мыши — позволяет выделить фрагмент для увеличения
- кнопка «A» — позволяет вернуть график в исходное состояние
4. Рисуем в файл
Для того чтобы получить файл graph.png с графиком нужно выполнить следующие команды в gnuplot:
gnuplot > set terminal png size 1024, 768
gnuplot > set output ‘graph.png’
gnuplot > plot ‘data.log’ u 1:2 w linesp, ‘data.log’ u 1:3 w linesp
и у вас в папке с gnuplot’ом появится файл graph.png с размером 1024×768. Его можно вставить в отчет. Будет круто)
5. Рисуем в 3D
Предположим мы хотим нарисовать функцию sin(x^2 + y^2)/(x^2 + y^2) (красивый график, похожий то, что произойдет после падения капли в воду).
В программе заводим массив a[N][N], программно вычисляем значение в точке (x, y), заносим это значение в a[i][j]. В конце записываем матрицу, как есть, в файл. Получаем нечто вроде:
matrix.dat
Просим gnuplot нарисовать картинку:
gnuplot > splot ‘matrix.dat’ matrix with lines
- splot ‘file’ matrix with lines — соединять точки графика прямыми
- splot ‘file’ matrix with pm3d — соединять точки поверхностью (поверхность меняет цвет в зависимости от значения функции (линии уровня))
- set pm3d at b (s) — рисовать внизу (наверху) поверхность уровней
- unset pm3d — отменяет предыдущую команду
- set view a,b — показать график под углом a, b (нужно для красивой отрисовки картинок)
- set ticslevel 0 (1) — график центрирован по z (график приподнят (удобно использовать совместно с set pm3d at b)
- set palette defined ( z1 «color1», z2 «color 2», . ) — определять цвета линий уровня, чтобы сделать график красивым. цвета можно посмотреть здесь
6. Автоматизация
Если хочеться мультика, то можно сделать такую штуку.
После каждой итерации выводим матрицу a в файл, генерируем скрипт для gnuplot, передаем ему управление (временно усыпив программу, чтобы она не испортила файл данных). Потом открываем папку, где будут лежать кучка кратинок: 1.png, 2.png, . ; открываем просмотрщик, жмем «—>» и наслаждаемся.
Кусок кода для Visual Studio:
main.cpp
Разумеется, пути к файлам надо поменять на правильные. Плюс, нужно дописать подходящие параметры для красивой отрисовки.
7. Помощь
В gnuplot есть интерактивная помощь. Ее всегда можно вызвать из командной строки gnuplot набрав help:
gnuplot > help
Там можно найти тьму интересных вещей =)
Построение числовых данных из файла (No.1)
Возможно, большинство из любителей gnuplot используют это приложение в области науки для посторения графика с целью построения графиков результатов от расчетов или экспериментальных данных. Они видят результаты на мониторе, вносят некоторые коррективы, сравнивают расчетные результаты с экспериментальными данными, и т.д. Если расчеты выполнены верно, то их сохраняют в формат postscript и печатаю на принтере, в противном случае файл EPS может быть включен в документ TeX научной статьи.
Что такое формат, который gnuplot может распознать?
2D данные
В файле столбцы данных разделяются пробелами и табуляторами. Если строка начинается со значка «#», то она игнорируется. Gnuplot может прочитать файлы любого формата, для этого необходимо указать формат файла. Смотри gnuplot help «using».
# X Y 1.0 1.2 2.0 1.8 3.0 1.6
Например, если у вас двумерный массив, одна строка содержит пары X и Y, как у казанно выше. Если X и Y неопределены, необходимо задать дополнительную колонку для погрешностей. Порядок столбцов не важен, потому что вы можете указать какой столбец используется для X, а какой для Y. Если первый столбец — значения X, а второй — значения Y, используем опцию using следующим образом:
gnuplot> plot "test.dat" using 1:2
Если опция using не используется, то первый столбец задается как значения X, а второй как значения Y автоматически.
Есть 2 способа заполнить бар погрешностей значениями Y. Первый способ — плюс/минус Z неопределенность значений Y. Второй способ — значения Y находящиеся в диапозоне [Z1,Z2]. В этом случае значения бара погрешностей больше и меньше значений Y. Первый случай требует 3 колонки данных, а последний — 4 колонки данных.
# X Y Z 1.0 1.2 0.2 2.0 1.8 0.3 3.0 1.6 0.2

# X Y Z1 Z2 1.0 1.2 0.8 1.5 2.0 1.8 0.3 2.3 3.0 1.6 1.0 2.1

Для построения этих данных, необходима опция using.
gnuplot> plot "test.dat" using 1:2:3 with yerrorbars
gnuplot> plot "test.dat" using 1:2:3:4 with yerrorbars
Число столбцов, необходимых для постороения, зависит от вида рисунка, который приводится дальше.
| Формат данных | Столбец | using | with |
|---|---|---|---|
| (X,Y) данные | X Y | 1:2 | lines, points, steps, linespoints, boxes, etc. |
| Y с ошибкой dY | X Y dY | 1:2:3 | yerrorbars |
| X с ошибкой dX | X Y dX | 1:2:3 | xerrorbars |
| Y с ошибкой dY, и X с ошибкой dX |
X Y dX dY | 1:2:3:4 | xyerrorbars |
| Y в интервале [Y1,Y2] | X Y Y1 Y2 | 1:2:3:4 | yerrorbars |
| X в интервале [X1,X2] | X Y X1 X2 | 1:2:3:4 | xerrorbars |
| Y в интервале [Y1,Y2], и X в интервале [X1,X2] |
X Y X1 X2 Y1 Y2 | 1:2:3:4:5:6 | xyerrorbars |
3D данные.
Трехмерные данные задаются (X,Y,Z). По умолчанию, они представляют точку в трехмерном пространстве. Когда используется вместе с опцией with lines рисуются линии, gnuplot показывает 3D линии или поверхности в зависимости от формата данных. Следующий пример содержит 4 блока данных, которые разделяются одной пустой строкой. Число пар (X,Y) различно для каждого блока данных. В этом случае, gnuplot не отобразит поверхности, но покажет 3D линии.
# X Y Z 0 0 0 0 1 1 0 2 4 0 3 9 0 4 16 0 5 25 1 0 1 1 1 2 1 2 5 1 3 10 1 4 17 2 0 4 2 1 5 2 2 8 2 3 13 3 0 9 3 1 10 3 2 13
gnuplot> splot "test3d.dat" using 1:2:3 with lines

Теперь, если число пар (X,Y) одинаково:
# X Y Z 0 0 0 0 1 1 0 2 4 0 3 9 0 4 16 0 5 25 1 0 1 1 1 2 1 2 5 1 3 10 1 4 17 1 5 26 2 0 4 2 1 5 2 2 8 2 3 13 2 4 20 2 5 29 3 0 9 3 1 10 3 2 13 3 3 18 3 4 25 3 5 34

Поверхность приобретет вид сетки. Хотя значения Y (второго столбца) в каждом блоке этого примера одинаковы, gnuplot так же рисует поверхность в виде сетки и при различных значениях Y (но количество точек одинаково). Такие данные рассматриваются как сетка данных. Когда ваши данные представленны ввиде сетки данных, gnuplot может сделать контрольную карту или скрытую обработку линий. Далее проходит небольшой тест — значения Y в последнем блоке удваиваются (изменен с Y=5 до Y=10).

Если необходимо не использовать сетку, а именно линии, но при этом блоки содержат одинаковое количество точек, то необходимо отделить в каждом блоке по 2 пустые строки.
# X Y Z 0 0 0 0 1 1 0 2 4 0 3 9 0 4 16 0 5 25 1 0 1 1 1 2 1 2 5 1 3 10 1 4 17 1 5 26 2 0 4 2 1 5 2 2 8 2 3 13 2 4 20 2 5 29 3 0 9 3 1 10 3 2 13 3 3 18 3 4 25 3 5 34

Матрицы.
Формат данных матрица — это альтернативный способ задать 3D данные. Когда значения X и Y (XY сетка) фиксированны, формат матрица является более удобным. В этом формате необходимым являются направления строки X и столбца Y.
0 1 4 9 1 2 5 10 4 5 8 13 9 10 13 18 16 17 20 25 25 26 29 34
Для построения этих данных используется matrix . Если данные представленны форматом матрица, то координаты X и Y — индексы строк и столбцов. В этом случае указывается диапазон X[0:3] и диапазон Y[0:5]. Если вы хотите изменить эти числа, используется команда set
gnuplot> set xtics ("100" 0, "200" 1, "300" 2) gnuplot> splot "test3d.dat" matrix with lines
Горное небо — для вас!
Gnuplot — это свободный инструмент для создания графиков. Поддерживается создание как двухмерных, так и трехмерных изображений.
Программа доступна для множества платформ — Linux, MS Windows, OSX и представляет собой утилиту командной строки, с собственным набором команд. Так же имеется возможность выполнять скрипты. Поддерживается вывод как непосредственно на экран, так и в файлы различных графических форматов.
Утилита очень удобна для визуализации и глубокого анализа различных научных данных. Встроенный скриптовый язык позволяет гибко задавать различные параметры визуализации.
Официальный сайт проекта — http://www.gnuplot.info/
Распространяется как в виде исходных кодов, так и в виде уже собранных пакетов и установочных файлов для различных операционных систем. В случае большинства дистрибутивов Linux программа доступна в репозиториях и устанавливается штатными средствами дистрибутива. Для Apple OSX установка доступна, например, через macports (см. http://www.macports.org/ )
В сети и в частности на официальном сайте доступны множество примеров использования gnuplot, русскоязычной же информации увы крайне мало.
В этой статье я рассмотрю несколько типовых примеров использования gnuplot в формате «подставил свои данные — получил график».
Для начала рассмотрим основные команды, которые будут актуальны практически каждый раз. Важный момент — все команды регистрозависимые, так что команда help будет понята утилитой, а вот Help — уже нет.
- help — собственно помощь, богатая встроенная интерактивная справка, можно получать справку по конкретной команде, например help plot
- set xlabel «моя подпись для x» — задает подпись для оси абсцисс
- set ylabel «моя подпись для y» — задает подпись для оси ординат
- set xrange [min:max] — задает лимиты значений для оси абсцисс, после выполнения команды ось на графике будет размечена от min до max, значения графика не попавшие в этот диапазон будут отброшены. Этот параметр может быть полезен для фильтрации ненужных значений или же для визуального отодвигания начала и конца графика от краев изображения. В качестве min, max могут быть целочисленные значения, числа с плавающей запятой, а так же даты.
Если вместо конкретного значения указать * — значение будет вычисляться автоматически, на основе минимального/максимального значения в данных.
По умолчанию gnuplot использует режим [*:*] с автоматическим вычислением.
- set yrange [min:max] — аналогично xrange, только для оси ординат.
- plot — собственно команда построения графика, эта команда принимает обязательный аргумент — источник данных для построения графика, это может быть имя файла с исходными данными, либо же математическая формула.
Есть возможность, через запятую, задать несколько источников данных — тогда на одном «полотне» будут нарисованы несколько графиков, так же можно указывать дополнительные параметры — тип графика, параметры отрисовки. Об этом в примерах ниже.
- set terminal — служебная команда, задает механизм вывода графика, по умолчанию вывод выполняется на экран (если доступна графическая оболочка), для переключения в режим записи в png файл следует выполнить команду set terminal png для возвращения в режим отображения на экране следует выполнить эту команду с иным аргументом:
-
-
-
- Для Windows: set terminal windows
- Для Linux: set terminal X11
- Для OSX: set terminal aqua
Полный список доступных терминалов можно узнать, если просто выполнить команду set terminal
- set output «filename.png» — задает имя выходоного файла, в случае если выбран соответствующий режим в set terminal
- set key — эта команда, вместе с различными параметрами позволяет управлять «легендой» графика, наиболее используемые варианты применения:
-
-
-
- set nokey — выключить отображение легенды
- set key — включить ранее выключенное отображение легенды
- set key title «подпись» — задает произвольную подпись к легенде
- set key — комбинацией параметров можно задать расположение легенды
Теперь настало время примеров, построим простейший график функции sin(x), установив легенду с произвольным текстом и расположением. Так же зададим ограничения значений по X
Запускаем gnuplot и вводим следующие команды (где > — приглашение командной строки gnuplot)
> set xrange [-2:5]
> set key horizontal top left
> set key title «график функции sin(x)»
После выполнения последней команды откроется окно с нарисованным графиком

Теперь рассмотрим более реальный пример — например зависимость уровня радиации от высоты.
У нас есть исходные данные — высота в метрах и уровень радиации в микрозивертах.
Сохраним эти данные в текстовый файл, в виде двух колонок (обязательное условие — разделителем дробной части должны быть точки)
Gnuplot и с чем его едят
Наверняка многие из вас листая западные научные издания видели красивые и простые графики. Возможно некоторые из вас задумывались в чём же эти учёные мужи визуализируют свою данные. И вот есть шикарный и очень простой инструмент для построения графиков, который есть практически везде: Windows, linux, android, и прочих, уверен даже есть под ДОС. Он надёжен, прост и позволяет представить в виде красивых графиков любые текстовые-табличные данные.
Почему именно 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> plot sin(x)

После выполнения команды у нас откроется окно, где будет график синуса, с подписями по умолчанию. Давайте улучшим этот график, заодно разберёмся с дополнительными опциями.
Подпишем оси.set xlabel "X"Задает подпись для оси абсцисс.
set ylabel "Y"Задает подпись для оси ординат.
Добавим сетку, чтобы было видно где построен график.
set gridМне не нравится, что по оси ординат синусоида упирается в конец графика, поэтому зададим лимиты значений, которыми будет ограничен график.
set yrange [-1.1:1.1]Таким образом график у нас будет отрисован от минимального значения -1,1 до максимального 1,1.
Точно так же, устанавливаю диапазон для оси абсцисс, чтобы был виден только один период синусоиды.set xrange[-pi:pi]Надо бы добавить заголовок к нашему графику, чтобы всё по феншую было.
set title "Gnuplot for habr" font "Helvetica Bold, 20"Обратите внимание, что можно задавать шрифты и их размер. Какие шрифты можно использовать, смотрите в документации на gnuplot.
Ну и наконец, давайте кроме синуса на графике ещё нарисуем и косинус, да ещё и зададим тип линии и её цвет. А так же добавим легенды, что же мы чертим.
plot sin(x) title "sinux" lc rgb "red", cos(x) title "cosinus" lc rgb "green"Здесь мы рисуем два графика на одном холсте, красным и зелёным цветом. Вообще вариантов линий (пунктир, штрих, сплошная), тощин линий, цветов великое множество. Как и типов точек. Моя цель лишь продемонстрировать спектр возможностей. Сведём все команды в одну кучку и выполним их последовательно. Чтобы сбросить предыдущие настройки, введём reset.
reset set xlabel "X" set ylabel "Y" set grid set yrange [-1.1:1.1] set xrange[-pi:pi] set title "Gnuplot for habr" font "Helvetica Bold, 20" plot sin(x) title "sinux" lc rgb "red", cos(x) title "cosinus" lc rgb "green"В результате получаем вот такую красоту.

График уже не стыдно публиковать в научном журнале.
Если вы повторяли честно всё это за мной, то могли заметить, что вручную каждый раз вводить это, даже копируя, как-то не комильфо. Но это же готовый скрипт? Так давайте же его и сделаем!
Выходим из командного режима, командой exit и создаём файл:vim testsin.gpi#! /usr/bin/gnuplot -persist set xlabel "X" set ylabel "Y" set grid set yrange [-1.1:1.1] set xrange[-pi:pi] set title "Gnuplot for habr" font "Helvetica Bold, 20" plot sin(x) title "sinux" lc rgb "red", cos(x) title "cosinus" lc rgb "green"Делаем его исполняемым и запускаем.
Ну не забываем как выйти из vim.chmod +x testsin.gpi ./testsin.gpiВ результате получаем такое же окно с графиками. Если в заголовке не добавить “-persist”, то окно автоматически закроется после выполнения скрипта.
Но окно создавать часто не очень нужно, плюс не всегда удобно им пользоваться, да и вы можете работать в операционной системе без GUI. Значительно чаще нужно получать графические файлы. Лично я предпочитаю векторный формат postscript, так как при большом количестве точек можно приближать различные участки графика, без потери качества. И так же просмотрщик в линуксе автоматически обновляет окно с графиком, при изменении файла postscript, что тоже весьма удобно.
Для того, чтобы вывести данные в файл, а не на экран, надо переназначить терминал.
set terminal png size 800, 600 set output "result.png"Как не трудно догадаться, указываем тип файла, его разрешение, затем указываем имя файла. Добавляем эти две строки в начало нашего скрипта, и получаем эту картинку в текущей папке.

Для того, чтобы сохранять в postscript нужно использовать следующие команды:
set terminal postscript eps enhanced color solid set output "result.ps"Реальные данные
Синусы, косинусы рисовать конечно прикольно, но всё же реальные данные рисовать намного интереснее! Напомню недавнюю задачу, о которой писал статью — вывод графиков скорости интернета за длительные промежутки времени. Формат данных там был следующий.
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Видно, что разделителем у нас служит точка с запятой, нам нужно вывести скорость загрузки, скорость выгрузки в зависимости от времени. При этом, если обратить внимание дата и время находятся в разных столбцах. Сейчас расскажу, как я это обошёл. Сразу приведу скрипт, по которому строился график.
#! /usr/bin/gnuplot -persist set terminal postscript eps enhanced color solid set output "Rostelecom.ps" #set terminal png size 1024, 768 #set output "Rostelecom.png" set datafile separator ';' set grid xtics ytics set xdata time set timefmt '%d.%m.%Y;%H:%M:%S' set ylabel "Speed Mb/s" set xlabel 'Time' set title "Rostelecom Speed" plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload" set title "Rostelecom 2 Ping" set ylabel "Ping ms" plot "Rostelecom.csv" using 3:8 with lines title "Ping"В начале файла мы задаём выходной файл 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.
Вы хотите 3D? Их есть у меня!
Долго думал, какой же пример трёхмерного графика привести, и не придумал ничего лучше, чем визуализировать картинку. Ведь по сути картинка — это трёхмерный график, где яркость пикселя — это координата по z. Поэтому давайте немного похулиганим.
Возьмём самое знаменитое фото Эйнштейна.
И сделаем из него график. Для этого конвертнём его в формат pgm ASCII и выкинем все пробелы, заменив переводом строки, такой простой командой.
convert Einstein.jpg -compress none pgm:- | tr -s '\012\015' ' ' | tr -s ' ' '\012'> outfile.pgmКто не понял, что здесь происходит, поясняю: мы конвертируем с помощью imagemagic картинку в формат pgm, а потом с помощью tr заменяем перевод каретки с переносом на новую строку на пробел, а потом все пробелы на перенос каретки и сохраняем это всё в outfile.pgm. Кому это сложно, могут открыть файл в gimp и экспортировать его как pgm-ASCII.
После чего открываем получившийся файл нашим любимым редактором
vimи удаляем у него заголовок. В моём случае это первые три строки. Из заголовка не забываем узнать разрешение файла, в данном случае было 325х408 пикселей. Всё, мы получили текстовый файл координат Z! Теперь наша задача добавить координаты X и Y, для этого прогоним всё это через питоновский скрипт.f = open('outfile.pgm') for x in range(408): for y in range(325): line = f.readline() print ('%d %d %s' % (x, y, line)), f.close()Сохраняем это как convert.py и запускаем:
python convert.py > res.txtВсё, у нас теперь 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
.Пример файла.
Скрипт для построения этой красоты выглядит следующим образом.
#! /usr/bin/gnuplot -persist #set terminal png size 1024, 768 #set output "result.png" #set grid xtics ytics #set terminal postscript eps enhanced color solid #set output "result.ps" set title "Albert Einstein" set palette gray set hidden3d set pm3d at bs set dgrid3d 100,100 qnorm 2 set xlabel "X" font "Helvetica Bold ,18" set ylabel "Y" rotate by 90 font "Helvetica Bold ,18" set zlabel "Z" font "Helvetica Bold ,18" set xrange [0:408] set yrange [0:325] set zrange [-256:256] unset key splot "./res.txt" with lПрежде чем мы пойдём разбирать скрипт, если вы будете это повторять, то настоятельно рекомендую выполнить строки скрипта в командном режиме, чтобы можно было мышкой вращать график (разумеется не указывая 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 с моими небольшими доработками.
Код генерирует текстовый файл и постоянно вызывает перестроение графика. Код приложу под спойлер, чтобы не рвать статью.
Пример кода на Си использующего gnuplot
#include #include #include float s=10.; float r=28.; float b=8.0/3.0; /* Definimos las funciones */ float f(float x,float y,float z) < return s*(y-x); >float g(float x,float y,float z) < return x*(r-z)-y; >float h(float x,float y,float z) < return x*y-b*z; >FILE *output; FILE *gp; int main() < gp = popen("gnuplot -","w"); output = fopen("lorenzgplot.dat","w"); float t=0.; float dt=0.01; float tf=30; float x=3.; float y=2.; float z=0.; float k1x,k1y,k1z, k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z; fprintf(output,"%f %f %f \n",x,y,z); fprintf(gp, "splot './lorenzgplot.dat' with lines \n"); /* Ahora Runge Kutta de orden 4 */ while(tfclose(gp); fclose(output); return 0; > Код работает очень просто, мы открываем pipe:
gp = popen("gnuplot -","w");Это аналогично вертикальной черте в bash, когда мы за одной командой пишем другую, только внутри программы. Пишем данные в файл lorenzgplot.dat. Один раз вызываем в gnuplot команду splot:
fprintf(gp, "splot './lorenzgplot.dat' with lines \n");И далее при добавлении новой точки, мы перестраиваем график.
fprintf(gp, "replot \n");В результате получаем очень красивое медленное построение Аттрактора Лоренца. Ниже видео, снятое почти десять лет назад, на старенький фотоаппарат, поэтому не ругайтесь сильно. Важно в видео другое, что всё это прекрасно работает на таком старом железе, как Nokia N800. Смотреть это желательно без звука.
Важно понимать, что команда replot очень хорошо кушает память и процессорное время, то есть, вот такое построение графика некисло так подтормаживает систему. Так что, при всей любви к gnuplot — это не лучший способ его использования. Ещё одна проблема, что данное окно не удастся ни закрыть, ни передвинуть.
Заключение
Напоследок хочу показать видео, в котором я собрал сотни графиков случайного логарифмического распределения регистраций радиоактивных частиц, реальные данные одного исследования. Видео можно и нужно смотреть со звуком.
В этой статье не смог рассказать и тысячной доли возможностей данного графопостроителя, разве что немного ознакомил читателя с данной программой. Далее вам следует самостоятельно искать примеры, читать документацию на официальном сайте gnuplot.sourceforge.net либо www.gnuplot.info. Обязательно загляните в примеры, там очень много интересного и полезного.
Для старта так же могу порекомендовать Краткое введение в gnuplot (рус). Искренне удивлён, что такая замечательная программа не изучается во всех технических ВУЗах наравне с Latex. У нас зачем-то учили MS Exel и Word.
Изучить gnuplot не сложно, я потратил буквально несколько дней в попытке разобраться с нуля. Но с данной статьёй, верю, что у вас всё будет быстрее. Теперь я забыл о всяких Exel/Calc в качестве графопостроителей, использую только гнуплот. Тем более, что я даже не знаю и десятой доли всех возможностей построения графиков.
Хочу отметить, что существуют множество других графопостроителей, не хуже, чем гнуплот, тем более, что он достаточно старый. Но для меня gnuplot оказался наиболее простым и исчерпывающим. Плюс он самый распространённый графопостроитель, и в сети громадное количество примеров его использования. Спасибо что дочитали!

- gnuplot
- графики
- построение графиков
- визуализация данных
- Блог компании RUVDS.com
- Визуализация данных
- Лайфхаки для гиков
-
-
-
-
-
-