Краткое описание программы Gnuplot под Виндовс

Виктор Кон, версия 150904

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

Общая информация

Но, главным образом, программа развивалась под Линукс, как прямой потомок Юникс. А в системе Виндовс пользователей, которые использовали эту программу было очень мало, да и сейчас немного. И тому есть причина. Дело в том, что программа сделана в полном соответствии с идеологией ОС Юникс. А эта система, как известно, ориентирована на программистов, то есть профессионалов. С другой стороны, в системе Виндовс была противоположная идеология. Она была ориентирована не на профессионалов, а на самых примитивных людей, которые ничего не знают и ничего учить не хотят.

Все программы в системе Виндовс работают по принципу WYSIWYG (what you see is what you get), что переводится на русский как "что ты видишь, то ты и получишь". То есть программы показывают готовый продукт после каждой операции, а все операции заказываются выбором из каскадной системы меню. И никакого программирования, боже упаси. Билл Гейтс потому и есть один из самых богатых, что он впаривал свою систему всем людям подряд, независимо от профессии и образования. И в этой системе очень легко можно было начать и сделать что-то простое. А вот дальше, когда надо сделать что-то посложнее, у всех, кому это было надо, возникали проблемы.

Программа Gnuplot работает по собственной программе, точнее, по протоколу, по системе команд. Язык программирования Gnuplot назвать языком в полном смысле рука не поднимается. Это скорее язык разметки, язык форматирования. Но все же для работы программы Gnuplot надо писать текст, состоящий из команд, которые программа исполняет последовательно одну за другой. И есть два способа работы программы. В первом используется интерактивный режим, в котором команды набираются и исполняются по одной. Удобство этого способа в том, что при выполнении команды программа может указать об ошибке и даже подсказать в чем эта ошибка состоит.

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

Вообще-говоря, существуют переносимые варианты программы Gnuplot, когда папку программы достаточно просто скопировать на компьютер и можно сразу пользоваться, то есть без установки. Но в системе Виндовс тогда придется дополнительно настраивать систему на автоматический запуск программы при клике на файлы с заданным расширением. А если скачать дистрибутив и установить программу, то она сразу будет запускаться при клике на файлах с расширением gp, gpl и plt. Лично я так и сделал. Тем более, что в таком виде мне удалось найти версию программы лета 2015 года, то есть совсем свежую.

Где ее взять? Я использую универсальный рецепт -- поиск Яндекса. Если набрать там "gnuplot скачать на русском", то сразу можно получить много сайтов, откуда ее можно скачать под Виндовс и на русском языке. Я скачал версию 5.0.1 с сайта каталога программ FreeSoft. После скачивания дистрибутива надо его запустить и программа установится в стандартную папку программ с названием "Program Files (x86)". Для нее будет создана папка с названием "gnuplot", а сама программа находится внутри в папке с названием "bin". Иконку на рабочий стол мне не сделали, но ее легко сделать вручную. А при автоматическом способе работы она и не нужна.

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

Именно такой способ шаблона удобен при генерировании протокола из другой программы автоматически. Структура команд программы Gnuplot устроена по очевидному принципу. Есть возможность построить график с помощью одной команды. То есть очень просто. При этом график будет иметь стандартный вид, такой, каким его сделали разработчики программы, потому что все параметры графика будут задаваться автоматически. Некоторым этого вполне достаточно. Такими командами являются команды plot (для функций одной переменной или двумерных (2D) графиков) и splot (для функции двух переменных или трехмерных (3D) графиков).

Все другие команды протокола графики не рисуют, а только устанавливают условия и параметры, которые используются при рисовании графиков. При этом, вообще говоря, все другие команды относятся к обоим (2D и 3D) типам графиков, но у некоторых команд могут быть отличия при использовании их в графиках разных типов. По умолчанию Gnuplot рисует график на экране компьютера, но можно сделать ему заказ, чтобы он рисовал в файл разных типов. Но это уже не так интересно. Есть много способов записать картинку прямо с экрана в файл с помощью сторонних программ. Лично я для этой цели использую небольшую собственную программу vkSM.jar, скачать которую можно на моем сайте в разделе программы. По этой причине начнем с того, что будем рисовать на экране.

И последнее замечание этого раздела. Программа поставляется с полным описанием всех ее команд. Оно написано в файле gnuplot.pdf в папке docs. В описании 250 страниц. Есть еще шпаргалка для тех, кто знает, но не помнит. Она написана в файле gpcard.pdf в той же папке и имеет 7 страниц. И есть еще папка demo, которая содержит очень много шаблонов, то есть протоколов графиков самого разного типа. Очень полезно просмотреть хотя бы некоторые из них, и код, и его результат. Разумеется все это написано на английском языке, и для тех, кто не знает язык, эти документы понять сложно, хотя примеры все равно можно смотреть. Я тоже их смотрел пока учился чего-то делать. А вот само описание на английском я полностью не читал, хотя могу прочитать. Я читал другие статьи на русском, которые все же можно найти в интернете.

Команда plot для рисования 2D графика

Хотя многие простые команды можно выполнять в интерактивном режиме, но я с самого начала буду писать команды в файле с расширением gp и для получения рисунка нужно просто кликнуть файл. Надо сразу сказать, что в Gnuplot можно не только рисовать, но и проводить кое-какие вычисления. То есть вводить переменные, описывать функции, устанавливать для них пределы изменения и так далее. Так как команда plot рисует функцию одной переменной, то по умолчанию такой переменной является переменная x. Наверно самая простая команда, по которой можно построить график такая

Я не буду показывать график, который рисует программа. Прежде, чем читать дальше, надо установить программу, записать указанный выше текст в файл с расширением .gp и запустить его. Важно, что на графике программа сама определяет пределы, сама размечает оси и сама знает каким цветом и как рисовать кривую. А также ставит указатель (title) кривой. Все это можно изменить и сделать так, как вам нужно.

Более того, рисовать функции по формулам интересно только школьникам и тем, кто не умеет программировать. Но графики нужно рисовать и тем, кто решает сложные задачи и вычисляет функции не по формулам, а по сложной программе. И не одну функцию, а сразу много или хотя бы две. Рассмотрим сразу более сложный пример, в котором сделан расчет двух функций Бесселя порядка 0 и 1 на одной и той же системе точек аргумента и обе функции вместе с аргументом записаны в файл 'b01.txt' в три колонки. В первой колонке аргумент, во второй функция Бесселя порядка 0, в третьей -- порядка 1. Я сначала напишу всю систему команд для графика, а потом объясню что делает каждая команда. Итак

Здесь много команд set со своими аргументами и в конце одна команда plot с более сложным аргументом. Очевидно, что команды set определяют условия рисования, в то время как команда plot указывает что и как надо рисовать. Посмотрим что конкретно делают команды. Первая команда set border устанавливает какие стороны ящика из четырех осей надо рисовать. Можно рисовать любую комбинацию, но все задается одним числом, которое представляет собой сумму чисел 1, 2, 4, 8. Каждое из чисел соответствует определенному разряду в двоичном представлении суммы и указывает какую сторону ящика чертить, а именно, 1 -- нижнюю, 2 -- левую, 4 -- верхнюю, 8 -- правую. Так 3 соответствует показу только нижней и левой осей, а 11 -- нижней, левой, и правой осей. И так далее. Здесь же можно указать толщину линий после параметра lw (line width) для рисования осей.

Вторая команда set style определяет режим рисования линий, проходящих через точки, данные в файле. Третья команда set margins определяет поля между границами рисунка и границами области рисунка. Надо отметить, что Gnuplot не дает возможности задавать размер рисунка, но после того, как рисунок нарисован его размер можно определить интерактивно, двигая правый нижний угол окна. Но при этом аспектное отношение не меняется. Его можно изменить только для самого рисунка задавая разные поля для разных направлений. Другим интересным фактом является то, что единицы измерения для полей тоже разные по разным направлениям, для оси X они примерно в 2 раза меньше, чем для оси Y, и значения самих полей проще всего устанавливать эмпирически, пробуя разные варианты. Аргументы команды задают поля в такой последовательности: левое, правое, нижнее, верхнее. Есть и отдельные команды с одним аргументом, а именно set lmargin, аналогично rmargin, bmargin, tmargin.

Следующая команда set xtics определяет как размечать ось X. Это касается рисок и числовых значений при них. Исходно программа рисует только риски с числовыми значениями. Параметр nomirror означает, что риски будут рисоваться только на главной оси, то есть нижней. Нам ее надо поставить, потому что верхнюю ось мы не рисуем, значит и риски не нужны. Здесь же можно указать тип шрифта и его размер для числовых значений. Следующая команда set mxtics определяет сколько мелких рисок надо нарисовать между рисками, у которых нарисованы числа. То же самое надо делать и для вертикальных осей. Но в команде set ytics указан только тип шрифта и его размер.

Следующая команда set xlabel указывает какой текст надо написать у нижней оси X . Текст пишется в кавычках, при этом можно использовать не только русские и латинские символы, но и греческие. Последние задаются через специальный фонт, например, {/Symbol b} означает, что будет нарисован символ бета. Соответствие латинских и греческих символов определяется таблицей

Буква  Символ   Буква  Символ   Буква  Символ   Буква   Символ  
 A     Alpha     N     Nu        a     alpha     n      nu
 B     Beta      O     Omicron   b     beta      o      omicron
 C     Chi       P     Pi        c     chi       p      pi
 D     Delta     Q     Theta     d     delta     q      theta
 E     Epsilon   R     Rho       e     epsilon   r      rho
 F     Phi       S     Sigma     f     phi       s      sigma
 G     Gamma     T     Tau       g     gamma     t      tau
 H     Eta       U     Upsilon   h     eta       u      upsilon
 I     iota      W     Omega     i     iota      w      omega
 K     Kappa     X     Xi        k     kappa     x      xi
 L     Lambda    Y     Psi       l     lambda    y      psi
 M     Mu        Z     Zeta      m     mu        z      zeta  

В тексте также можно указывать верхние и нижние индексы теми же командами, что и в Латехе, то есть ^1 для верхнего индекса и _1 для нижнего индекса. Когда надо указывать и верхний и нижний индексы одновременно, то перед ними надо ставить символ @, как и было сделано в указанном примере. Ну и снова можно указать тип и размер текста.

Следующая команда set ylabel аналогична предыдущей, но тут указан еще один параметр offset. Он означает отступ от стандартного положения. Так аргумент offset -4 означает, что текст будет отодвинут влево на определенное расстояние, которое зависит от единиц измерения. Но единицы очень сложные и лучше все определять эмпирическим путем.

Итак, описаны все условия рисования графика. Точнее, не все, а те, которые мы хотели описать. Все остальное будет выполняться, как и в первом примере, по умолчанию. Это касается, например, положения текста на оси X. Осталось нарисовать график. Это делает команда plot, но у нее есть аргументы. Первый аргумент 'b01.txt' указывает на файл, где записаны числа в текстовом формате. Файл должен находиться в той же папке, где и файл протокола, который мы обсуждаем. Если это не так, то можно указать более сложный относительный путь к файлу. Но проще все держать в одной папке. Параметр using 1:2 означает, что для кривой будут взяты первый и второй столбцы файла. Далее параметры lw 2 lc "black" задают толщину линии (line width) для кривой и цвет линии (line color) как черный. Цвет можно задавать разными способами. Наиболее простые цвета можно задавать по имени. Таблицу всех имен можно посмотреть в более полном описании. Есть способ задавать цвет комбинацией красного, зеленого и синего. В этом случае вместо имени надо писать "0xRRGGBB", RR задает красный цвет в 16-ричной системе от 00 до FF (то есть от 0 до 255), и то же самое для зеленого и синего. Так "0x0000FF" означает синий цвет.

Наконец ti -- это сокращение от title. Этот параметр указывает каким именем обозвать кривую в легенде, которая помогает различать кривые. Если легенда не нужна, то следует писать notitle. Итак, мы полностью описали первую кривую. Вторая кривая задается точно также, после запятой. Снова указывается тот же самый файл, то на этот раз первый и третий столбцы. Затем другая толщина линий, другой цвет и другая легенда. Но на одном графике можно рисовать и больше кривых и даже из разных файлов.

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

Здесь сам текст пишется в кавычках, параметр at указывает куда его поставить, причем в качестве координат используются значения на осях. Параметр center указывает, что на координаты надо поставить центр текста, параметр rotate by указывает на какой угол надо повернуть текст, параметр font так же, как и раньше. Наконец, параметр tc (можно писать и длинно textcolor) указывает цвет текста.

Если многие из указанных выше команд задания условий рисования имеют конечный функционал, то есть и такие, о которых можно писать очень много и долго. Такой командой является set style. Начать с того, что даже команда set style data имеет очень много вариантов, потому что данные можно рисовать линиями, маркерами, линиями и маркерами в разных пропорциях, маркерами разных видов, которых очень много. Ведь недаром в книге 250 страниц. Я всего этого здесь писать не буду (пока), но кроме данных можно определять и другие объекты, например, сами линии. Так команда

задает промежуточную информацию, а именно, стиль линии с номером 1 как цветную (команда lt rgb), в данном примере зеленую, толщиной 2 и размером точек 4. Размер точек не будет учитываться, если данные заданы как line в команде set style data lines, но если в ней поменять lines на linespoints (сокращенно lp), то на линиях будут маркеры. Их тоже можно описать. Если такая команда задана, то в команде plot достаточно указать тип линии как ls 1 вместо того, чтобы задавать толщину и цвет.

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

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

Интересно, что если стиль линии не указывать, то по умолчанию программа рисует разные линии разными цветами. Например, всего одна команда

может нарисовать сколько угодно кривых разными цветами. Здесь показан пример другого задания типа данных, то есть вместо команды set style data lines на отдельной строке написано with lines. И это имеет тот же самый смысл. Вообще команда with может часто использоваться как аргумент команды plot. Вполне возможно, что разные цвета можно задать и принудительно, но я пока не посмотрел как это делается.

Другая ситуация возникает когда на одном графике надо сравнить кривые, записанные в две колонки разных файлов. Здесь тоже может помочь цикл. Пусть те же самые кривые, что и раньше, записаны в два файла b0.txt и b1.txt. Тогда команда может быть такой

Как мы видим, здесь для имени файла используется строковая переменная filename, а в квадратных скобках после команды for указывается ее значение как список файлов, разделенных пробелами и в кавычках, так как это строка. Название переменной может быть любым, например, можно заменить filename на fn.

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

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

Я указал в этом разделе только некие базовые команды, которые позволяют делать наиболее массовые графики. Но возможностей управлять рисунком намного больше и для того, чтобы описать все, надо снова написать 250 страниц. Я пока не стану это делать, учитывая, что описание ведь есть в самой программе. Теперь вы знаете что и где надо смотреть, чтобы попробовать сделать что-то другое. Так, например, в команде set style data lines слово lines можно заменить на points, linespoints, impulses, dots, steps, errorbars (or yerrorbars), xerrorbars, xyerrorbars, boxes, boxerrorbars, boxxyerrorbars. И все эти стили можно описать, конкретно указав, как их показывать.

То же самое относится к разметке осей. Например, риски можно рисовать как внутрь (по умолчанию), так и наружу, можно задать их размер и так далее. Как это делается я опишу чуть позже. Здесь я только хочу сказать, что совсем не страшно пользоваться командами и очень легко посмотреть как это делается. В программе также очень много примеров, в которых можно посмотреть разные варианты протоколов. В заключение хочу отметить, что Gnuplot для Виндовс рисует график в окне, которое имеет меню. В частности там есть кнопка, которая позволяет спасти рисунок в файл. Хотя у программы для этого есть свой механизм, но часто достаточно и этой кнопки. Просто надо знать, что она спасает в файл площадь всего окна со всеми пустыми местами. А окно можно менять и так, что пустых мест будет много. То есть за этим надо сделить.

Ну и я забыл еще написать, что символ # в любом месте используется как указатель на комментарий. То есть текст после этого символа не будет выполняться до конца строки. Если он стоит первым в строке, то вся строка не выполняется. Это можно использовать, чтобы временно отключить какие-то команды в протоколе.

Команда splot для рисования 3D графика

Если программу рисования двумерного графика легко написать и самостоятельно, в частности, даже прямо на языке постскрипт, как написано в моей книге , то рисовать функции двух переменных как трехмерный объект намного сложнее. Прежде всего, для такого графика надо очень много чисел. В общем случае массив чисел представляет собой матрицу из n строк и m колонок. Самый простой, но и самый затратный способ состоит в том, что в файле данных задают в каждой строке три координаты одной точки, то есть x, y и z. Сначала перечисляют все точки первой строки, затем после нее надо поставить пустую строку и то же самое проделать для второй строки и всех остальных. Пусть у нас приготовлен такой файл для функции z = 1000*exp(-x^2-y^2) и он называется exp3c.txt. Тогда нарисовать функцию можно очень просто командой

Я напомню, что Gnuplot может и просто функции рисовать, но этот вариант я даже не хочу обсуждать, потому что рисовать функции нужно только школьникам при изучении этих функций. А более серьезные люди рисуют более сложные функции. Экпоненту я взял просто как пример. Если посмотреть на график, который делает данная команда, то легко заметить, что он состоит из точек, которые рисуются маркерами. Это означает, что по умолчанию выполняется команда set style data points. Это правильно, потому что при задании всех трех координат точки, они могут располагаться как угодно, даже не обязательна матрица, достаточно одной строки.

Но если у нас матрица, и если это исправить, то есть выполнить две команды

то поверхность будет нарисована линиями, но при этом линии за горизонтом все равно рисуются. Это тоже можно исправить, если добавить еще одну команду

Теперь вроде бы все нормально, но программа рисует трехмерную поверхность слегка приподнятой над плоскостью аргументов. Это неплохой прием, как мы увидим позже. Но иногда хочется, чтобы было как у всех. Это тоже можно исправить, если добавить еще одну команду

И сразу стал виден недостаток автоматической разметки осей аргументов, когда риски смотрят внутрь. Трехмерная поверхность практически их закрывает. Это можно исправить командой set tics out. По умолчанию испольуется set tics in. Эта команда работает и для двумерных графиков. Более того, все команды разметки осей, описанные выше для двумерных графиков, работают и для трехмерных, только появляется еще и третья ось z. Например, можно использовать команды set xrange, set yrange и set zrange. Также точно можно убирать и ставить легенду, можно указывать два файла через запятую, определять цвет линий и так далее.

Важное значение опять имеет команда set margins, поскольку аспектное отношение окна графика изменить нельзя и это можно сделать только задавая поля. Но в трехмерном случае программа реагирует только на два параметра из 4-х, то есть на поле слева и снизу. Остальные поля можно задавать, но они не изменятся. Однако, для изменения аспектного отношения достаточно просто поля слева.

Но есть и дополнительные команды, которые работают только с трехмерными графиками. Самой важной из них для аксонометрии является команда точки зрения. По умолчанию она работает с какими-то параметрами. Но можно изменить эти параметры. Это делает команда set view. Она имеет 4 аргумента, которые надо задавать через запятую. Первый указывает угол вращения вокруг оси X, второй указывает угол вращения вокруг оси Z, третий указывает общее масштабирования, а четвертый -- масштабирование только оси Z. Если третий и четвертый параметры не нужны, то их можно не писать.
   
Здесь полезно отметить, что протокол рисунка позволяет рисовать не только один рисунок, а много. И эти рисунки можно показывать через определенное время. Для этого существует команда pause, у которой может быть два аргумента. Первый указывает время паузы, а второй текст, который будет напечатан в это время. Если указать отрицательное время, то программа будет ждать пока пользователь не нажмет какую-нибудь клавишу. Вот типичный пример протокола на два рисунка

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

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

При рисовании цветом программа выставляет шкалу цветов дополнительно к оси Z. Если посмотреть на рисунок внимательно, то можно увидеть, что максимальное значение 1000 у шкалы цветов вылезает за правую границу окна. Как это исправить я пока не знаю. Конечно можно сделать так, чтобы максимум функции был меньше 1000, видимо на это и был расчет.

Цветные объемные рисунки очень наглядны, но у них есть такой недостаток, что они скрывают часть зависимости. Чтобы увидеть все надо показывать несколько рисунков, вращая объект вокруг оси Z. Этого недостатка лишены так называемые карты цветов, когда на плоскости аргументов функцию показывают именно цветом. Чтобы выйти на такой рисунок надо указать команду set view map, а полный протокол может быть таким

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

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

Здесь все команды знакомы кроме двух, а именно, unset surface и set contour base. Ну и стиль рисования указан параметром with вместо команды set. Их смысл очевиден, а именно, отказ от рисования поверхности, и заказ рисования контуров.

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

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

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

При рисовании 3D графиков важное значение имеет то, как задавать данные, то есть числа для графика. При задании каждой точки на отдельной строке текстом получаются файлы огромных размеров, если точек много. Кроме того, часто рисуются матрицы, просчитанные в цикле с постоянным шагом, и вовсе нет нужны указывать позицию каждой точки, так как она легко вычисляется из номера числа в массиве. К сожалению, такой подход в программе Gnuplot не реализован. Вместо этого есть способ задавать только матрицу функции, то есть только Z координату, без указания X и Y координат вообще. Для этого надо записать числа таким образом, чтобы все числа первой строки были на первой строке файла, разделенные пробелами, все числа второй строки на второй строке и так далее. Пусть та же самая функция записана в файл указанным способом. Тогда вот такой протокол ее нарисует достаточно красиво

Здесь все знакомо и уже было описано раньше. Единственное отличие состоит в том, что после имени файла стоит слово matrix. Так как аргументы никак не указаны, то программа вместо аргументов использует номер строки и столбца матрицы. И это никак нельзя исправить. Ясно, что такие рисунки годятся только для внутреннего пользования.

Наиболее компактной является запись чисел в компьютерном коде. То есть так, как они записываются в памяти компьютера. Программа умеет работать и с такими данными, точнее  форматом float, по которому записываются 4 байта на число с точностью до семи знаков. В этом случае файл должен быть организован несколько иначе, а именно, первым числом ставится число колонок, а затем все значения аргумента y, всего m чисел для матрицы размером n*m. Затем ставится первое значение аргумента x и после него все значения первой строки матрицы, следом ставится второе значение аргумента x и все значения второй строки матрицы, и так далее. Всего в файле должно быть (n+1)*(m+1) чисел.

Важно, что при такой записи значения аргументов присутствуют в файле и они даже не обязательно должны меняться с постоянным шагом. Но все строки имеют одинаковый аргумент x, а все столбцы -- одинаковый аргумент y. Если такой массив записан в файл expb.dat, то вот такой протокол его красиво нарисует

Отличие от предыдущей программы лишь в том, что поменяли имя файла и вместо слова matrix написали слово binary.

К сожалению в использовании этого режима есть неприятная особенность для java программистов. Дело в том, что Gnuplot под Виндовс и компьютерный код читает в стиле Виндовс, то есть младшие байты вперед. А java под Виндовс все равно записывает числа в компьютерном коде так же точно, как в системе Юникс, то есть старшие байты вперед. И программа Gnuplot не понимает бинарные файлы, записанные в программах на языке программирования java. После того, как такие файлы записаны, в них еще надо переставить местами каждые 4 байта. Моя программа vkACL.jar как раз является java программой. Но она работает с моим же языком программировани ACL и на этом языке переставить байты можно с помощью трех команд.

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



  Внимание! Сайт оптимизирован под браузер Google Chrome.