How to Create a Spider Plot in Gnuplot?

here's a hack attempt..

set nokey
set polar
set grid polar
set angles degrees
set size square
set style data lines
a1=0
a2=30
a3=100
a4=200
a5=300
set arrow nohead from 0,0 to first 10*cos(a1) , 10*sin(a1)
set arrow nohead from 0,0 to first 10*cos(a2) , 10*sin(a2)
set arrow nohead from 0,0 to first 10*cos(a3) , 10*sin(a3)
set arrow nohead from 0,0 to first 10*cos(a4) , 10*sin(a4)
set arrow nohead from 0,0 to first 10*cos(a5) , 10*sin(a5)
set xrange [-10:10]
set yrange [-10:10]
plot '-' using ($1==1?a1:($1==2?a2:($1==3?a3:($1==4?a4:($1==5?a5:$1))))):2 lt 2
1 4
2 8
3 6
4 9
5 5
1 4

Here is a suggestion for a "spider-plot" taken from my collection. Since it uses data from a datablock instead from a file (because it's easier to address certain lines, e.g. via $Data[1]), therefore, it requires gnuplot >=5.2.0. The actual data is in $Data and some settings for ranges and custom offset adjustments are in $Settings. The number of axes is automatically adjusted if you add some more rows in $Data and $Settings. Data needs to be separated by whitespace, because the gnuplot function word(string,number) is used to extract some values.

I hope it is more or less self-explaining. Comments, report of bugs or improvements are welcome.

Code:

### spider plot/chart with gnuplot 
# also known as: radar chart, web chart, star chart, cobweb chart, 
#                radar plot,  web plot,  star plot,  cobweb plot,  etc. ...
reset session
set size square
unset tics
set angles degree
set key top left

# Data
$Data <<EOD
SpiderData     "Product A"  "Product B"  "Product C"  "Product D"
Colors                red        green         blue       violet
"attribute 1"           2           10            7          3.5
"attribute 2"           1          0.5            3            4
"attribute 3"          37           58           49           72
"attribute 4"        1985         1992         2006         2010
"attribute 5"         0.1          0.5          0.3          0.8
EOD
HeaderLines = 2

# Settings for scale and offset adjustments
# axis min max tics axisLabelXoff axisLabelYoff ticLabelXoff ticLabelYoff
$Settings <<EOD
1     0    12  6  0.00 -0.02 -0.05  0.00
2     0     6  6  0.00  0.05  0.00  0.05
3    30    90  6  0.00  0.00  0.05  0.03
4  1980  2016  6  0.00  0.00  0.09 -0.02
5     0   1.2  6  0.00  0.05  0.00 -0.05
EOD

# General settings
DataColCount = words($Data[1])-1
AxesCount = |$Data|-HeaderLines
AngleOffset = 90
Max = 1
d=0.1*Max
Direction = -1   # counterclockwise=1, clockwise = -1

# Tic settings
TicCount = 6
TicValue(axis,i) = real(i)*(word($Settings[axis],3)-word($Settings[axis],2)) \
          / word($Settings[axis],4)+word($Settings[axis],2)
TicLabelPosX(axis,i) = PosX(axis,i/TicCount) + word($Settings[axis],7)
TicLabelPosY(axis,i) = PosY(axis,i/TicCount) + word($Settings[axis],8)
TicLen = 0.03
TicdX(axis,i) = 0.5*TicLen*cos(alpha(axis)-90)
TicdY(axis,i) = 0.5*TicLen*sin(alpha(axis)-90)

# Functions
alpha(axis) = (axis-1)*Direction*360.0/AxesCount+AngleOffset
PosX(axis,R) = R*cos(alpha(axis))
PosY(axis,R) = R*sin(alpha(axis))
Scale(axis,value) = real(value-word($Settings[axis],2))/(word($Settings[axis],3)-word($Settings[axis],2))

# Spider settings
set style arrow 1 dt 1 lw 1.0 lc -1 head     # style for axes
set style arrow 2 dt 2 lw 0.5 lc -1 nohead   # style for weblines
set style arrow 3 dt 1 lw 1 lc -1 nohead     # style for axis tics
set samples AxesCount
set isosamples TicCount
set urange[1:AxesCount]
set vrange[1:TicCount]
do for [i=1:DataColCount] {                  # set linetypes/colors
    set linetype i lc rgb word($Data[2],i+1)
}
set style fill transparent solid 0.2

set xrange[-Max-4*d:Max+4*d]
set yrange[-Max-4*d:Max+4*d]
plot \
    '+' u (0):(0):(PosX($0,Max+d)):(PosY($0,Max+d)) w vec as 1 not, \
    $Data u (PosX($0+1,Max+2*d)+word($Settings[$0+1],5)): \
        (PosY($0+1,Max+2*d)+word($Settings[$0+1],6)):1 every ::HeaderLines w labels center enhanced not, \
    '++' u (PosX($1,$2/TicCount)):(PosY($1,$2/TicCount)): \
        (PosX($1+1,$2/TicCount)-PosX($1,$2/TicCount)):  \
        (PosY($1+1,$2/TicCount)-PosY($1,$2/TicCount)) w vec as 2 not, \
    '++' u (PosX($1,$2/TicCount)-TicdX($1,$2/TicCount)): \
        (PosY($1,$2/TicCount)-TicdY($1,$2/TicCount)): \
        (2*TicdX($1,$2/TicCount)):(2*TicdY($1,$2/TicCount)) \
        w vec as 3 not, \
    for [i=1:DataColCount] $Data u (PosX($0+1,Scale($0+1,column(i+1)))): \
        (PosY($0+1,Scale($0+1,column(i+1)))) every ::HeaderLines w filledcurves lt i title word($Data[1],i+1), \
    '++' u (TicLabelPosX($1,$2)):(TicLabelPosY($1,$2)): \
        (sprintf("%g",TicValue($1,$2))) w labels font ",8" not
### end of code

Result:

enter image description here