23.05.2010

Строим простые сглаженные графики в gnuplot

Подробная инструкция с разъяснениями, как построить простые 2d графики в gnuplot со сглаженными линиями (аналог графика в Excel - "гладкие графики") с легендой.

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

Затевать изучение gnuplot имеет смысл, если вы собираетесь более или менее часто строить всевозможные графики и диаграммы. В противном случае, для одноразового использования, быстрее и проще получить результат от визуальных средств/мастеров создания графиков в электронных таблицах OpenOffice Calc, Gnumeric, Excel.

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

Сразу приведу результат работы, что бы было понятно о чем далее идет речь:



Обратите внимание на одну важную особенность этого графика - метки по оси Х располагаются на пропорциональном расстоянии в соответствии с их значением (чего я никак не мог добиться в Excel). Кроме того, отсутствует название графика, так как оно будет добавлен в текстовом процессоре во время верстки.

Итак, первое, что нужно сделать - создать в текстовом редакторе (например vim, gedit, geany и т.п) новый файл и сохранить его с любым именем, но с расширением *.sh скрипта. Пусть в нашем случае это будет plot.sh. После сохранения, в консоле сделаем скрипт исполняемым:
chmod +x plot.sh
 Исходные данные находятся в текстовом файле data.csv:
? "Т=60 °С" "Т=80 °С"
0 0 0
15 7,01 8,43
30 9,43 12,89
60 15,42 23,17
120 14,34 21,71
180 13,76 20,64
Данные вводятся построчно, каждый столбец отделяется табуляцией. Обратите внимание на первую строку.  Надписи "Т=60 °С" и "Т=80 °С" используются для подписи обозначений в легенде (см. рис. готовый график вверху и пункт 10 ниже). Если в надписи входит пробел, то кавычки обязательны. Знак вопроса над первым столбцом указывает, что для этого столбца подписи нет (в моем случае первый столбец значения по оси Х). 

Ниже привожу содержимое файла plot.sh (рабочий вариант скрипта без нумерации строк см. в конце поста):
  1 #! /usr/bin/gnuplot -persist
  2 set terminal png enhanced
  3 set output "plot3.png"
  4 set size ratio 0.5
  5 set xlabel "Время обработки, с"
  6 set ylabel "Повышение сорбции красителя, %"
  7 set xtics ("0" 0, "15" 15, "30" 30, "60" 60, "120" 120, "180" 180)
  8 set autoscale y
  9 set grid
 10 set key autotitle columnhead
 11
 12 plot "data.csv" using 1:2 smooth csplines notitle with lines lt -1,\
 13 "data.csv" using 1:2 with points pointsize 1 pointtype 7 lt -1,\
 14 "data.csv" using 1:3 smooth csplines notitle with lines lt -1,\
 15 "data.csv" using 1:3 with points pointsize 1 pointtype 13 lt -1

Теперь по порядку по каждой строке:
1 #! /usr/bin/gnuplot -persist
1. Указывает какой интерпретатор комманд скрипата будет использоваться.

2 set terminal png enhanced
2. Устанавливает тип терминала (растровые и векторные форматы: png, svg, ps, eps, а так же интерактивные x11 и wxt, wxt - по умолчанию). Я выбрал png так как графика будут вставляться в документ MS Word, возможно его новые версии и поддерживают формат svg, но ХР и 2003 о нем ничего не знают.

3 set output "plot3.png"
3. Устанавливает вывод в файл с указанным именем.

4 set size ratio 0.5
4. Устанавливает соотношение длины и ширины графика - по умолчанию равен 1 (когда size ratio не указывается), т.е. график будет "квадратным". Коэффициент 0.5 уменьшает маштаб по оси У и график получается вытянутым вдоль оси Х. Какой выбрать коэффициент и нужен ли он вообще зависит от ваших данных и от того, на чем нужно акцентировать внимание, либо, наоборот, что то нужно сделать таким образом, что бы не бросалось в глаза.

5 set xlabel "Время обработки, с"
6 set ylabel "Повышение сорбции красителя, %"
5, 6. Подписи к осям Х и У.


7 set xtics ("0" 0, "15" 15, "30" 30, "60" 60, "120" 120, "180" 180)
7. Подписи (метки) по оси Х. Введение этого параметра указывает gnuplot, какие метки нужно установить. В моем случае они совпадают с экспериментальными точками. Этот параметр необязателен и нужен в том случае, когда автоматически созданные метки по каким то причинам не удовлетворяют автора. Однако неудобен тем, что для каждого типа исходных данных этот параметр может изменяться.

8 set autoscale y
8. Автоматическое масштабирование оси У. Необязательный параметр. В большинстве случаев облегчает жизнь, если нужно строить большое число однотипных графиков.

9 set grid

9. Включает отображение сетки на графике.

10 set key autotitle columnhead
10. Указывает, что нужно использовать первую строку в файле с данными как подпись в легенде для каждого столбца с данными. Очень полезен при построении большого количества графиков.

12 plot "data.csv" using 1:2 smooth csplines notitle with lines lt -1,\
12. Команда построения (plot) из файла данных "data.csv" используя столбцы 1 и 2 (using 1:2) сглаженного (smooth) графика методом csplines, без подписи (notitle) с тонкой линией with lines, черного цвета lt -1. Обратите внимание, что будет построена только сама линия без точек по которым строилась эта кривая. Для построения точек используется следующая строка 13. Запятая указывает на завершение параметров команды plot. Символ "\" как и в bash указывает, на разрыв строки, т.е. что команда будет продолжена с новой строки.

13 "data.csv" using 1:2 with points pointsize 1 pointtype 7 lt -1,\
13.  Продолжение комманды плот, но уже с другими параметрами - для построения точек на кривой (with points). Размер точек pointsize 1. Тип маркера точек pointtype 7. Цвет lt -1.
14 "data.csv" using 1:3 smooth csplines notitle with lines lt -1,\15 "data.csv" using 1:3 with points pointsize 1 pointtype 13 lt -1
14,15 построение второй кривой на этом же графике используя столбцы 1 и 3 и другой маркер точек. Обратите внимание, что последняя строка завершается без запятой и обратного слеша.

Основной минус работы с gnuplot - это необходимость работы с многостраничным англоязычным мануалом. С другой стороны развитый GUI превратился бы просто в кошмар - так как у программы огромное количество параметров. За гибкость приходиться платить временем.

Что еще можно почитать о gnuplot:
на русском - перевод нескольких статей о gnuplot Записки дебианщика 
мануал  gnuplot на оф. сайте 
Отличная книга (на англ.) Gnuplot in Action: Understanding Data with Graphs Philipp K. Janert (кто ищет, тот найдет)
GNUplot FAQ
LinuxFormat #71