06.03.2010

Построение графиков в Linux, русские надписи в gnuplot

Решил написать о своих приключениях с gnuplot. Это не столько рекомендация, сколько исповедь о мучениях. Я пришел к выводу, что gnuplot нужен в том случае, если предполагается строить большое количество однотипных графиков, либо графики строятся по большому количеству данных, полученных машинным способом. Тратить же время на разбор всех его команд расточительно, если для статьи нужно сделать всего 1-2 графика разных видов. Но самое главное! Почти все ВАКовские журналы (во всяком случае в Украине) принимают статьи в формате Microsoft Word. Вставленные в Word растеризованный ps файл в формате png смориться просто безобразно - плывет графика, плохо виден текст в названии осей. Пробовал вставлять в Word непосредственно файл eps - результать еще хуже :( К сожалению Microsoft Word (Office 2003) не может работать с svg, видимо по религиозным причинам.



Итак, есть данные, нужно построить график с двумя осями Y, т.е. фактически 2 графика в общей области - это удобно и наглядно для анализа некоторых данных.
В файлах цифры столбцов отделены друг от друга табом, это движок blogger его съедает.
Содержание файла grafik.csv
x c
0 100
4 73
5 63,2
6 62,4
8 62,9
24 33

Содержание файла grafik2.csv
x w
4 76,5
5 78
6 78,2
8 78,3
24 80

Содержимое командного файла plot.sh:

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid font "/usr/share/fonts/truetype/times.ttf" 14
set encoding koi8r
set output "plot.eps"
set terminal postscript enhanced "Times-Roman" 14
set size ratio 0.5
set xlabel "Время, часы"
set ylabel "Концентрация H_2O_2 на ткани, %" font "Times,18"
set y2label "Белизна, %"
set yrange [0:100]
set xrange [0:24]
set xtics ("4" 4,"5" 5,"6" 6,"8" 8,"24" 24)
set ytics nomirror
set ytics 5
set mytics 2
set y2tics 5
set my2tics 2
set grid
set autoscale y
set key at 10,12.10
plot "grafik.csv" using 1:2 smooth csplines notitle with lines lt -1,\
"grafik.csv" using 1:2 title "Концентрация H_2O_2 на ткани" with points pointsize 1 pointtype 7 lt -1,\
"grafik2.csv" using 1:2 smooth csplines notitle with lines lt -1,\
"grafik2.csv" using 1:2 title "Белизна" with points pointsize 1.5 pointtype 13 lt -1

Все было бы чудесно, но вот только в Ubuntu и в большинстве других современных дистрибутивах используется по умолчанию кодировка UTF8, с которой gnuplot вобще не дружит. Поэтому для того, что бы на графике корректно отображались надписи на руском нужно перекодировать скрипт в koi8-r:

iconv -f utf8 -t koi8-r plot.sh -o plot.koi.sh

это теоретически можно сделать и в vim командой

set fileencoding=koi8-r

однако у меня почему то vim на эту команду не реагирует :(

Запускаем скрипт, на выхлопе получаем файл plot.eps
который конвертируем в png:

convert -density 600 plot.ps -resize 400 testing.ps

Вот, что получается:


Время, затраченное на построение этого графика в gnuplot ~3-х часов! Однако здесь удалось отобразить по оси Х время пропорционально, как сделать так в Excel не знаю.

А теперь сравните с результатом в Excel (скриншот из VirtualBox):

Время, затраченное на построение этого графика в Excel ~15-ти минут!

В Microsoft Word качество отличается еще больше, чем заметно здесь, да это и понятно, график Excel в векторе.

Из OpenOffice Calc графики можно экспортировать в Excel путем сохранения рабочей книги в формате xls.
Вот исходный график, созданный в OpenOffice Calc:


А вот тот же график, открытый в Microsoft Excel:


Как видно, нарушилось расположение заголовка, в целом, оформление сохранилось в том же виде как и у исходного графика.