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:


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

13 комментариев:

  1. Не хочу ни оправдывать, ни ругать gnuplot, но если вы до этого с ним не работали, то не удивительно, что потратили столько времени. Есть такая шутка про win & lin:

    "Чем отличаются пользователи линукс и виндоус?
    Первые хорошо потрахаются и потом всю жизнь кайфуют, а вторые поставят, покайфуют месяц, а потом всю жизнь трахаются."

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

    ОтветитьУдалить
  2. Анонимный07.03.2010, 07:38

    Надеюсь excel у вас лицензионный, ибо время потраченное на отсидку будет равно ~2года

    ОтветитьУдалить
  3. да я не в претензии к гнуплоту - это профессиональный инструмент, требующий обучения работы с ним, главный раздражающий фактор для меня в гнуплоте это отсутствие поддержки utf8

    а с Excel работаю так как пока в силу обстоятельств не вижу замены, при этом приходиться работать в виртуальной машине, так как в wine и в crossover не все функции Excel работают корректно

    ОтветитьУдалить
  4. А Вы в курсе про существование R? http://cran.r-project.org/

    Там множество систем графики.

    ОтветитьУдалить
  5. про R знаю, пока не пробовал

    ОтветитьУдалить
  6. А utf8 не печатается из за постскрипта. Он увы не умеет, по крайней мере в виде ghostscript.

    ОтветитьУдалить
  7. так если выставить терминал png все равно кирилица не выводится

    ОтветитьУдалить
  8. ...вряд ли писали свой растеризатор шрифтов.

    ОтветитьУдалить
  9. Анонимный09.03.2010, 13:12

    Уж если вы заюзали эксель, то что вам помешало поюзать OO.o Calc?

    ОтветитьУдалить
  10. поюзать OO.o Calc мешает то, что сдавать статьи приходиться в doc причем в разных редакциях разные версии МС офиса, поэтому, что бы избежать возвратов статьи или непредвиденных результатов в оформлении и использую эксель

    ОтветитьУдалить
  11. Анонимный17.03.2010, 13:18

    Данно гнуплотюсь - файл koi-8 не проблема gedit в любой кодировке работает даже cp-1251 (форточная). А вот другая проблема с издательствами - там сейчас одни придурки сидят кроме офиса ничего не знают, а про Tex вообще не слышали. Что поделаещь - живем в стране делитантов (В том числе и в здравоохранении). Так что ищите профессионалов и работайте только сними, так как лузер он самодостаточен и перевоститанию не подлнжит!

    ОтветитьУдалить
  12. Анонимный06.05.2010, 13:14

    С юникодом gnuplot прекрасно работает, нужно только указать ему подходящий шрифт. DejaVuSans, к примеру, или любой другой юникодный шрифт из вашей системы.

    ОтветитьУдалить
  13. Попробуйте qtiplot :)
    Если из проприентарщины - то лучший выбор - origin

    ОтветитьУдалить