Pull to refresh

Gnuplot 5.0. Spiderplot на 4 оси своими руками

Reading time 3 min
Views 2.6K
image
При работе над визуализацией данных для статьи возникла необходимость иметь 4 оси с положительными метками на всех.


Как и для других графиков статьи, я решил использовать gnuplot. Первым делом заглянул на официальный сайт, где есть множество примеров. Очень порадовался, когда обнаружил нужный пример (не много поработаю напильником и будет красиво, подумал я).
image
Быстренько скопировал код, запускаю. Получаю ошибку. Разбираюсь. Оказалось, что у меня старенький gnuplot (Version 5.0 patchlevel 3 last modified 2016-02-21) и он так не умеет.

Зная о гибкости gnuplot, начал шарить просторы всемирной паутины и наткнулся на несколько подходящих примеров на stackoverflow (Double x-axis on a spider plot with Gnuplot и How to Create a Spider Plot in Gnuplot?) и github (gnuplot-radarchart). Они стали отправной точкой.

Далее, мои манипуляции с командами привели к следующему:

0) Отключаем границы
unset border

1) Создаем 4 нулевых линии — 2 основных и 2 дополнительных:
set xzeroaxis
set yzeroaxis
set x2zeroaxis
set y2zeroaxis

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

2) Настраиваем отображение тиков на осях:
max = 1.5 # Для гибкости
min = -max
set xtics  axis  0,.5,max in scale 0.5,0.25 mirror norotate  autojustify offset 0.35
set ytics  axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify            
set x2tics axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify            
set y2tics axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify            

С тиками на осях настроек чуть больше.
axis — где будут находиться тики, на оси или (border — на границе).
Для оси x, которая уходит вправо 0,.5,max. Первое число — начало отсчета, второе — шаг, третье — конец отсчета. Для первой от 0, а для остальных от 0.5, чтобы нули не мешались в начале координат.

Смешивание нулей в центре координат Без offset
Смешивание нулей в центре координат.
Все интервалы *tics настроены как 0,.5,max
Без offset 0.35 для xtics

Настройка scale 0.5,0.25 mirror добавляет засечки на ось. Если поиграться с числами, то будет меняться их размер.
Также ввожу переменные max, min, с помощью которых управляю границами осей графика.
Дополнительную информацию по настройке тиков можно найти в документации в разделе Xtics.

3) Настраиваем диапазоны осей:
set xrange  [ min : max ] 
set yrange  [ min : max ]
set x2range [ max : min ]
set y2range [ max : min ]

Здесь следует отметить, что 2 оси начинают отсчет от min на увеличение и 2 оси — с max на уменьшение.
Дополнительная информация в разделе Xrange.

4) Даем осям имена и красиво их размещаем:
set label "H_1" at  0,       max center offset char  2, 0
set label "H_2" at  max+0.1, 0   center offset char -1, 1
set label "H_3" at  0,       min center offset char -2, 0
set label "H_4" at  min,     0   center offset char  0, 1

5) Формируем входные данные
На каждый график выделено по 2 столбца. Номер строки — номер оси, пятая строка, чтобы замкнуть контур. Нечетная колонка — координата x, четная — y. Ввиду того, что все точки располагаются на осях, то из пары (x, y) одна всегда равна нулю.
Несмотря на то, что все 4 оси положительные, некоторые данные искусственно перемещаются на отрицательную половину, потому что располагаются на основных осях x и y.
 0  1  0     1.21
 1  0  1.21  0   
 0 -1  0    -1.06
-1  0 -1.19  0   
 0  1  0     1.21 #Дубликат первой точки

Результат
Итого
Полный код
#!/usr/bin/gnuplot -persist
#файл в кодировке cp1251 чтоб русские буквы отображались в eps

set encoding cp1251
set terminal postscript eps enhanced monochrome size 5cm,5cm
set output "./img/eps/fig2.eps"

unset border
set key at -2, 1.5 font 'LiberationSerif, 23' 
set key left top samplen 4.5

set xzeroaxis
set yzeroaxis
set x2zeroaxis
set y2zeroaxis

max = 1.5
min = -max

set xtics  axis  0,.5,max in scale 0.5,0.25 mirror norotate  autojustify offset 0.35 font 'LiberationSerif, 20
set ytics  axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify             font 'LiberationSerif, 20
set x2tics axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify             font 'LiberationSerif, 20
set y2tics axis .5,.5,max in scale 0.5,0.25 mirror norotate  autojustify             font 'LiberationSerif, 20

set xrange  [ min : max ]
set yrange  [ min : max ]
set x2range [ max : min ]
set y2range [ max : min ]

set label "H_1" at  0,       max center offset char  2, 0   font 'LiberationSerif, 23'
set label "H_2" at  max+0.1, 0   center offset char -1, 1   font 'LiberationSerif, 23'
set label "H_3" at  0,       min center offset char -2, 0   font 'LiberationSerif, 23'
set label "H_4" at  min,     0   center offset char  0, 1   font 'LiberationSerif, 23'

set style line 1 linetype 1 pointtype 7 linewidth 3 linecolor black
set style line 2 linetype 2 pointtype 7 linewidth 3 linecolor black

plot 'data.csv' using  1:2 title "1" w lp ls 1 ,\
     'data.csv' using  3:4 title "2" w lp ls 2

Tags:
Hubs:
+8
Comments 2
Comments Comments 2

Articles