Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
При работе над визуализацией данных для статьи возникла необходимость иметь 4 оси с положительными метками на всех.
Как и для других графиков статьи, я решил использовать gnuplot. Первым делом заглянул на официальный сайт, где есть множество примеров. Очень порадовался, когда обнаружил нужный пример (не много поработаю напильником и будет красиво, подумал я).
Быстренько скопировал код, запускаю. Получаю ошибку. Разбираюсь. Оказалось, что у меня старенький 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
, чтобы нули не мешались в начале координат.Смешивание нулей в центре координат. Все интервалы *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