Istogramma numerico asse x in gnuplot?
Domanda
Sto avendo questo file come data.dat
:
Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00
posso tracciare questi dati come istogramma con questo script, hist-v1.gplot
(utilizzando set style data histogram
):
set xlabel "X values"
set ylabel "Occurence"
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set term png
set output 'hist-v1.png'
set boxwidth 0.9
# attempt to set xtics so they are positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)
# ti col reads the first entry of the column, uses it as title name
plot 'data.dat' using 2:xtic(1) ti col, '' u 3 ti col, '' u 4 ti col, '' u 5 ti col
E chiamando:
gnuplot hist-v1.gplot && eog hist-v1.png
Tuttavia, si può notare che l'asse X non viene ridimensionato numericamente - capisce i valori X come le categorie (vale a dire si tratta di un asse di categoria)
. posso ottenere un asse X più numerica con il seguente script, hist-v2.gplot
(utilizzando with boxes
):
set xlabel "X values"
set ylabel "Occurence"
# in this case, histogram commands have no effect
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set term png
set output 'hist-v2.png'
set boxwidth 0.9
set xr [330:400]
# here, setting xtics makes them positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)
# 1:2 will ONLY work with proper xr; since we have x>300; xr[0:10] generates "points y value undefined"!
plot 'data.dat' using 1:2 ti col smooth frequency with boxes, '' u 1:3 ti col smooth frequency with boxes
E chiamando:
gnuplot hist-v2.gplot && eog hist-v2.png
questa immagine è generata: immagine Hist-v2.png http://img266.imageshack.us/img266/6717/ histv2.png
Purtroppo, le barre 'sovrapposizione' qui, quindi è difficile da leggere il grafico.
C'è un modo per mantenere l'asse X scala numerica come in hist-v2.png
, ma mantenere lato disseminati bar a fianco con come in hist-v1.png
? Questa discussione, " Re: Istogramma con asse x data errore " dice che non puoi:
Ma sarà difficile tirare la data coordinata x di file di dati, ...
ma poi, si riferisce a un problema differente ...
Grazie,
Cheers!
Soluzione
Ok, dopo aver letto l'aiuto gnuplot
per un po ', sembra che lo stile istogramma sarà '' sempre '' interpretare x asse come sequenziali immissioni / categorie - così effettivamente, sembra che ci sia alcun modo per ottenere un asse numerico con una stile istogramma.
Tuttavia, si scopre che $
può fare riferimento a una colonna, e questi possono essere utilizzati per effettivamente 'riposizionare' bar nel secondo (stile frequency with boxes
) esempio; Quindi, con questo codice come hist-v2b.gplot
:
set xlabel "X values"
set ylabel "Occurence"
set style fill solid border -1
set term png
set output 'hist-v2.png'
set boxwidth 0.9
set xr [330:400]
# here, setting xtics makes them positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)
# 1:2 will ONLY work with proper xr; since we have x>300; xr[0:10] generates "points y value undefined"!
plot 'data.dat' using ($1-0.5):2 ti col smooth frequency with boxes, '' u ($1-0.25):3 ti col smooth frequency with boxes, '' u ($1+0.25):4 ti col smooth frequency with boxes, '' u ($1+0.5):5 ti col smooth frequency with boxes
E chiamando:
gnuplot hist-v2b.gplot && eog hist-v2b.png
questa immagine è generata: immagine Hist-v2b.png http://img823.imageshack.us/img823/805/ histv2b.png
... che è più o meno quello che volevo in primo luogo.
Solo una piccola nota - ho originariamente voluto usare lo script con i dati in linea; per una messa a punto come questo, avrebbe dovuto essere scritto come
plot '-' using ($1-0.5):2 ti col smooth frequency with boxes, '-' u ($1-0.25):3 ti col smooth frequency with boxes
Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00
end
Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00
end
... che è, i dati dovrebbe essere più volte inseriti, come viene in da stdin - questo problema è discusso in gnuplot - fare più trame da file di dati con built-in comandi .
Cheers!
PS: Come v'è un po 'di spazio sullo schema, sarebbe bello se potessimo in qualche modo specificare intervalli x-assi separati; che viene discusso in:
Altri suggerimenti
Impostazione della larghezza della scatola è propriamente molto importante quando si traccia un istogramma con "scatole" stili di stampa. In uno dei miei blog articolo ho parlato. Se dell'interesse, fai clic qui !