Создание графиков в gnuplot: деления на осях

Gnuplot автоматически подгоняет деления на осях под данные, однако в сложных графиках их нужно переопределить - о чём говорится ниже.


Как изменить деления для каждой из осей?
Есть два вида делений на осях: основные и дополнительные. Обычно на осях отрисовываются только основные деления, и по умолчанию дополнительные отбражаются только при логарифмическом масштабе. Для переопределения делений на осях используется команда set {x|y}tics например, так:

gnuplot> set xtics 2
gnuplot> set ytics 0,200
gnuplot> plot x**3




Это приведёт к тому, что приращение по оси Х будет равняться 2, так что деления становятся вида -10, -8, ... +10. Для оси Y задано начальное значение (0) и приращение (200), так что GNUplot создаёт деления в точках 0, 200, 400...

Так же можно указать конечное значение, например так:
gnuplot> set ytics 0,200,600.
Дополнительные деления задаются параметром set m{x|y}tics. Интервалы между основными засечками делений делятся на это значение:
gnuplot> set mxtics 2
gnuplot> set mytics 2




Так же возможно поместить собственный текст в деления осей вместо чисел. Например, написать "April", "May", "June", и "July" в позициях X=1,2,3 и 4, что возможно осуществить следующей командой:
gnuplot> set xtics ("April" 1, "May" 2, "June" 3, "July" 4)
gnuplot> plot "test.dat" using 1:2:3 notitle with boxes,\
"test.dat" using 1:2 notitle with lines




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

Команда set ticscale n m изменяет масштаб чисел в деления. Главные деления умножаются на величину n, тогда как дополнительные умножаются на величину m. Если m опущено, дополнительные деления принимают значение половины от величины главной деления.

деления отрисовываются внутрь, а чтобы они отрисовывались наружу, следует указать:
gnuplot> set tics out


Как использовать степенные деления?
Для этого следует переопределить формат следующим образом::
gnuplot> set format x "10^{%g}"
Теперь по оси Х деления станут вида 10^0, 10^1... и так далее.




Как использовать экспоненциальные деления вместо десятичных в логарифмических осях?
Формат по умолчанию "%g", а в логарифмических осях метки записываются в формате "F", например 0.01, 1000, и так далее, если данные в пределах от 0.0001 до 100000. Числа, выходящие за этот диапазон, записываются в формате "E" и записываются как 1e-05, 1e+06, и т.д.

Чтобы сделать деления к осям в виде степени 10, измените формат на "10^{%L}":
gnuplot> set format y "10^{%L}"
Для корректного отображения надстрочных и подстрочных индексов следует использовать расширенный postscript-терминал, добавив в скрипт построения графиков:
gnuplot> set terminal postscript eps enhanced
Вот что получится:



Как убрать отображение чисел из деления?
Просто добавьте параметр:
gnuplot> set format x ""
деления по оси Х отображаться не будут.


Как отобразить промежуточные значения в логарифмическом масштабе?
Обычно логарифмические деления к осям отображаются степенями 10 (1,10,100...). Иногда для лучшего понимания данных, изображённых на графике, требуется поместить засечки на осях между главными подписями, особенно когда диапазон значений невелик. Вот как это можно сделать:
gnuplot> set logscale y
gnuplot> set yrange [1:50]
gnuplot> set ytics (1,2,5,10,20,50)
gnuplot> set format y "%2.0t{/Symbol \327}10^{%L}"
gnuplot> set lmargin 8
gnuplot> set terminal postscript eps enhanced
gnuplot> plot exp(x)/x
Тёмно-красным выделен небольшой хак, который позволяет выводить деления как "число умноженное на 10^n".

Результат на рисунке:


Этот Postscript-символ отображает умножение точкой. Чтобы изменить его на "крестик", используйте {/Symbol \264}. Описанный здесь хак работает не всегда и не на всех системах.


Как изменить формат чисел в деления осей (общий вопрос)?
Это более общее описание форматов деления к осям: за это отвечает команда set format. Синтаксис команды такой:
set format имяоси{x|y|z|xy|x2|y2} "формат строки"
Например, чтобы гнуплот показывал деления в как десять цифр и три после запятой, нужно дать команду:
gnuplot> set format x "%10.3f"
Синтаксис для цифро такой: "%" + (полная длина).(точность).

Формат отображения выражается одной буквой -- 'f', 'e', 'E', 'g', 'x', 'X', 'o', 't', 'l', 's', 'T', 'L', 'S', 'c' и 'P'. По умолчанию используется "%g". Следующая таблица показывает разницу между форматами 'f', 'e', 'x' и 'o'. Форматы 'e' и 'E' одинаковы всегда, кроме случая, когда текст написан в формате 'e' or 'E'. Формат "%O" присутствует в мануале к гнуплоту, но не работает (скорее всего, ошибка в программе)


Пример (подчёркивание означает пробел)
f десятичны %6.3f __6.00
e,E экспоненциальный %11.4e _5.0000e+01
x,X шестнадцатеричный %x fffffffb
o,O восьмеричный %o 37777766

Форматы 't', 'l', 'T' и 'L' относятся к логарифмическим графикам. Для примера построим график функции y=exp(-x)+exp(x) в диапазоне X значений [-10:10]. Во-первых, эта функция отображается в нелогарифмическом масштабе, так что отобразим данные сразу в трёх форматах:

gnuplot> set format y "%T %t %g"
gnuplot> plot exp(-x)+exp(x)



Можно задать другие форматы при одновременном отображении, как и в этом случае. В данном примере, "%t" отвечает за мантиссу по основанию 10 и "%T" отвечает за степень по основанию 10. Таким образом, число, выраженное в формате "%g", отображается как A x 10^B, где A задано в формате "%t" и B в формате "%T".

Теперь перестроим график:
gnuplot> set logscale y
gnuplot> replot



13 комментариев: |высказаться!| RSS-лента дискуссии.|
Анонимный комментирует...

Спасибо, ценный материал особенно для студента тех. ВУЗа

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

2 Анонимный пишет...
Спасибо, ценный материал особенно для студента тех. ВУЗа
Пожалуйста.
В общем, деление документации по гнуплоту на отдельные посты в моём исполнении, может быть, несколько условное, но мне кажется, что такую кучу параметров лучше воспринимать постепенно, а не всю сразу :-)

Если я где-то ошибся или что-то не учёл, как всегда, пишите в комментарии.

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

Да, несколько вопросов имеется:

1. Можно ли привести оси к виду более привычному по школьной алгебре -- т.е. ось ординат в центре, посередине ее пересекает ось абсцисс?
2. Как отобразить проекции вектора (допустим) на оси?
3. Как указать на осях координаты произвольных точек, которые находятся на графике функции? В принципе, можно обойтись и set {x|y}tics, но как-то криво это, да, к тому же, пропадают все остальные деления.

На gnuplot в первый раз посмотрел вчера :) Ответы на вопросы сам пока не искал, но раз уж такая возможность...

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

Кстати, вот такую красоту нарисовал (4Кб):

http://img209.imageshack.us/img209/8816/52pltan8.png

Вроде ничего особенного, но как-то, не знаю, очень эстетично :)

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

Действительно, интересеная заметка. Пользуюсь gnuplot на пару с octave для расчетных работ и лабораторных. К сожалению, дж ля чертилки стандартная документация слабовата.

Спасибо!

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

если можно в следующем посте поподробнее осветить возможность диаграмм с помощью boxes
особенно интересует возможность создания трёхмерных диаграмм с помощью boxes...
одна надежда на Вас :)
хоть и пишут, что GnuPlot активно используется в науке, но изучая рунет этого не скажешь :(
большинство ссылок ведут на этот интересный блог

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

2 Анонимный пишет...
1. Можно ли привести оси к виду более привычному по школьной алгебре
Можно, конечно. Об этом у меня в следующем посте :-) Но команда такая: set {x|y}zeroaxis.

2. Как отобразить проекции вектора (допустим) на оси?
Не знаю.

3. Как указать на осях координаты произвольных точек, которые находятся на графике функции?
Увы, у меня несколько иные задачи, так что подсказать не смогу.

На gnuplot в первый раз посмотрел вчера :)
Тогда смотреть лучше сюда

2 Анонимный пишет...
Кстати, вот такую красоту нарисовал
Да, неплохо. Графики в гнуплоте вообще очень хорошо выглядят. Профессионально, что ли.

2 Vk пишет...
Действительно, интересеная заметка. Пользуюсь gnuplot на пару с octave для расчетных работ и лабораторных.
Для, на пару с октавой гнуплот это вещь. Заметка у меня не последняя на эту тему, так что оставайтесь на волне :-)

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


2 mikhail пишет...
если можно в следующем посте поподробнее осветить возможность диаграмм с помощью boxes
Диаграммы я не строю, только графики.

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

хоть и пишут, что GnuPlot активно используется в науке, но изучая рунет этого не скажешь :(
А вам рунет что, мать родная? Если вы считаете себя научным работником и вам не плевать (как 90% моих коллег) на результат своего труда - используйте ЛаТеХ и гнуплот. Профессиональный подход и хорошие результаты видно сразу, а бездарные вордовые документы с кривыми екселевскими графиками быстро выдают компьютерную безграмотность автора.

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

Но насколько мне известно, ресурс Kawano никто на русский не переводил. Если это не так - кидайте ссылку.

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

***Если вы считаете себя научным работником и вам не плевать (как 90% моих коллег) на результат своего труда - используйте ЛаТеХ и гнуплот***
большинство журналов на Украине (по крайней мере где я пытался публиковаться принимают файлы только в формате MS Word :(

Боюсь, что говорить о компьютерной грамотности (во всяком случае нашем ВУЗе) говорить и не приходиться, т.к. большинство доцентов (о профессуре вообще умолчу) даже в Excel затрудняются хоть что то выдавить.
Веду курс "Информационные технологии" для наших студентов химиков поэтому и заинтересован в том что бы сначала самому освоить, а потом уже официально в рабочую программу запихать как можно больше opensource, ибо в учебном процессе, а значит и потом в работе, используются только коммерческие программы :( и большинство студентов 99% даже не знают, что программное обеспечение покупается и лицензируется.
А характерной особенность наших данных является необходимость наглядного сравнения полученных результатов - для чего лучше всего подходят диаграммы. Поковырял ОО Calc как то коряво выходит. Вот и вышел на гнуплот. Но документации, особенно русскоязычной, к сожалению, действительно маловато.....

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

2анонимный:
> 2. Как отобразить проекции вектора (допустим) на оси?

Можно

1) рисовать произвольные стрелки на графике, см. пример http://t16web.lanl.gov/Kawano/gnuplot/label2-e.html#4.5

2) можно отобразить векторное поле с помощью стрелок, пример идёт в документации к gnuplot: http://gnuplot.sourceforge.net/demo_4.2/vector.html

2mikhail:

> если можно в следующем посте поподробнее осветить возможность диаграмм с помощью boxes
особенно интересует возможность создания

Примеры построения столбцовых диаграмм в gnuplot см. http://gnuplot.sourceforge.net/demo_4.2/histograms.html

Только мне показалось, что если нужно рисовать в том числе и столбцы «отрицательной» высоты, то gnuplot тут не поможет.

С помощью matplotlib/pylab я сделал вот так:
http://img246.imageshack.us/my.php?image=atf3vitellinlogya6.png

Если интересно, могу объяснить в ближайшее время в своём блоге http://sovety.blogspot.com/ как.

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

Спасибо за полезную информацию!
А не знаете ли Вы как построить график f(1/T), где кроме оси 1/T была бы еще одна ось абсцисс T. То есть, необходимо, чтобы одной оси x были сопоставленны значения 1/x на другой. Просто мне она нужна для наглядности. Пробовал сделать так:
set x2range [1/xmin:1/xmax]
Но проблема-то в том, что засечки делаются с равномерным шагом, а не обратным. Как сделать так, чтобы программа понимала с какими промежутками ставить деления?

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

Можно, конечно, тупо так написать:
set x2tics ("1000" 1000**(-1), "800" 800**(-1) , "700" 700**(-1), "600" 600**(-1), "500" 500**(-1), "400" 400**(-1), "300" 300**(-1))
Собственно, так и сделал, но интересует нет ли автоматизации такого процесса, просто логарифмический масштаб-то есть, а обратного линейному не нашел пока.

Unknown комментирует...
Этот комментарий был удален автором.
Ruslan комментирует...

Для научной работы необходимо построить график в программе gnuplot, дело в том что он состоит из четырех веток нижняя ось это 10^1, 10^2 … 10^7, вертикальная ось [2:7], точки бывают по середине участков 10 и 10^1, как их вводить? Что написать в блокноте? Как построить 4 ветви( set multiply --> plot “1” --> plot “2” --> plot “3” --> plot “4” --> set nomultiply , правильно я понимаю?)

# Graphic 1
10 2 350
15 2.3 350
30 2.35 350
85 2.38 350
115 2.38 350
600 3 350
800 3.8 350
1000 4.4 350
2100 4.7 350
2350 5.05 350
5000 5.25 350
7000 5.6 350
9500 5.7 350
20000 5.85 350
35000 5.9 350
-->Это значения первого графика ( так необходимо сделать все четыре?)
Главная проблема состоит в том что я не могу указать степенную последовательность чисел 10^1, 10^2... и так далее и сопоставить свои значения с блокнотом(что именно там необходимо писать по оси x).
Заранее безумно благодарен!

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

Подписаться на RSS-ленту комментариев к этому посту.