2012-10-03 26 views
5

Mi piacerebbe produrre un grafico spider (aka radar/stella) usando Gnuplot dove assi diversi hanno scale indipendenti. Sono in grado di produrre tale trama usando OriginPro (commerciale), ma con Gnuplot sono in grado di impostare una trama radar con scala uniforme.Come creare un grafico Spider in Gnuplot?

L'(file CSV) set di dati è simile al seguente (prima riga è etichette di colonna):

# FEATURE, Product_A, Product_B, Product_C, Product_D 
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 

e la trama che sto cercando è questo: https://www.dropbox.com/s/uvqubzqvm6puhb8/spider.pdf - Come si può vedere ogni stand assi per un attributo diverso e ha la sua scala.

Credo che il codice che inizia Gnuplot è:

set polar 
set grid polar 
set angles degrees 
set size square 
set style data filledcurves 

Ma io non so come procedere. Eventuali suggerimenti?

risposta

1

La risposta da @george mi ha aiutato a capire come riorganizzare il set di dati, al fine di raccogliere da esso i dati degli attributi corrispondenti. Poiché stavo anche cercando scale di distanza diverse per i diversi assi spider, oltre al suggerimento di @ george, ho pensato che una normalizzazione specifica dell'asse all'intervallo [0: 1] comune avrebbe risolto il problema. La modifica principale è quindi correlata al campo using del comando plot.

Il codice è abbastanza lungo, sono sicuro che potrebbe essere ottimizzato. Potrebbe anche essere unito a uno script oa un semplice codice C, in modo da consentire all'utente di decidere il numero di assi (numero di attributi) e i diversi intervalli (min, max) per ciascun asse specifico.

L'esempio seguente è per 5 attributi che confrontano 2 prodotti. Qui viene mostrato il plot result image:

set nokey 
set polar 
set angles degrees 
npoints = 5 
a1 = 360/npoints*1 
a2= 360/npoints*2 
a3= 360/npoints*3 
a4= 360/npoints*4 
a5= 360/npoints*5 
set grid polar 360. 
set size square 
set style data lines 
unset border 
set arrow nohead from 0,0 to first 1*cos(a1) , 1*sin(a1) 
set arrow nohead from 0,0 to first 1*cos(a2) , 1*sin(a2) 
set arrow nohead from 0,0 to first 1*cos(a3) , 1*sin(a3) 
set arrow nohead from 0,0 to first 1*cos(a4) , 1*sin(a4) 
set arrow nohead from 0,0 to first 1*cos(a5) , 1*sin(a5) 
a1_max = 10 
a2_max = 5 
a3_max = 100 
a4_max = 2020 
a5_max = 1 
a1_min = 0 
a2_min = 0 
a3_min = 50 
a4_min = 1980 
a5_min = 0 
set label "(0:10)" at cos(a1),sin(a1) center offset char 1,1 
set label "(0:5)" at cos(a2),sin(a2) center offset char -1,1 
set label "(50:100)" at cos(a3),sin(a3) center offset char -1,-1 
set label "(1980:2020)" at cos(a4),sin(a4) center offset char 0,-1 
set label "(0:1)" at cos(a5),sin(a5) center offset char 3,0 
set xrange [-1:1] 
set yrange [-1:1] 
unset xtics 
unset ytics 
set rrange [0:1] 
set rtics (""0,""0.25,""0.5,""0.75,""1) 

plot '-' using ($1==1?a1:($1==2?a2:($1==3?a3:($1==4?a4:($1==5?a5:$1))))):($1==1?(($2-a1_min)/(a1_max-a1_min)):($1==2?(($2-a2_min)/(a2_max-a2_min)):($1==3?(($2-a3_min)/(a3_max-a3_min)):($1==4?(($2-a4_min)/(a4_max-a4_min)):($1==5?(($2-a5_min)/(a5_max-a5_min)):$1))))) w l 
1 8 
2 3 
3 67 
4 2000 
5 0.2 
1 8 

plot '-' using ($1==1?a1:($1==2?a2:($1==3?a3:($1==4?a4:($1==5?a5:$1))))):($1==1?(($2-a1_min)/(a1_max-a1_min)):($1==2?(($2-a2_min)/(a2_max-a2_min)):($1==3?(($2-a3_min)/(a3_max-a3_min)):($1==4?(($2-a4_min)/(a4_max-a4_min)):($1==5?(($2-a5_min)/(a5_max-a5_min)):$1))))) w l 
1 6 
2 1.5 
3 85 
4 2010 
5 0.5 
1 6 
+0

Controlla questo [http://stackoverflow.com/questions/30649826/how-to-highlight-regions-of-plot-with-gnuplot/30684027#30684027], è molto più facile regolare il numero di stelle ecc. – Karl

3

ecco un tentativo di mod ..

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 
+0

Grazie @george per la risposta! Davvero apprezzato. La funzione logica nel campo di utilizzo per il comando plot mi ha aiutato molto a risolvere il problema. – CarloAlberto

Problemi correlati