2014-11-18 10 views
5

Sto usando GNUplot per tracciare le orbite da un file di dati. Voglio usare autoscale xy in modo che lo script GNUplot non debba essere modificato a seconda dei dati. Tuttavia, quando ordino, autoscale non imposta lo xrange come uguale a yrange. Questo rende le orbite "schiacciate".GNUplot Set scala automatica xrange uguale a yrange

Ho provato a utilizzare set size square e set size ratio -1 How to set equal scale's length in gnuplot.

Ma questo non ha funzionato.

Esiste comunque la possibilità di forzare autoscale per rendere uguali gli intervalli xey?

Grazie!

risposta

5

No, non esiste alcuna opzione per l'autoscalaggio per gli intervalli X e Y sugli stessi valori. Ecco una soluzione, come puoi farlo con alcuni trucchi.

Se si desidera mantenere gnuplot di estensione degli intervalli per i prossimi tic, si può fare come segue:

È innanzitutto necessario tracciare una volta usando il terminale unknown. Ciò consente di risparmiare i valori x e y nelle variabili gnuplot GPVAL_X_MIN, GPVAL_X_MAX, GPVAL_Y_MIN e GPVAL_Y_MAX. Poi si impostano gli intervalli e replot:

set terminal push # save current terminal 
set terminal unknown 
plot 'datafile' 
set terminal pop # restore previous terminal 

min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN) 
max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX) 

set xrange[min:max] 
set yrange[min:max] 
set size ratio -1 

replot 

La roba push/pop è necessario solo se si desidera mantenere le impostazioni del terminale iniziali.

Per rendere questo riutilizzabile, ad es. per l'utilizzo con multiplot, è possibile avvolgere tutti quei comandi all'interno di una stringa e chiamare eval su di esso:

autoscale_xy(datafile) = \ 
    "set terminal push; set terminal unknown; set autoscale;".\ 
    "plot '".datafile."'; set terminal pop;".\ 
    "min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN);".\ 
    "max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX);".\ 
    "set xrange[min:max]; set yrange[min:max];" 
... 

files = "first second third fourth" 
do for [f in files] { 
    eval(autoscale_xy(f)) 
    plot f 
} 

Un'altra possibilità sarebbe quella di utilizzare stats per calcolare il valori y massimo e minimo e x- e impostare gli intervalli di conseguenza:

stats 'datafile' using 1:2 nooutput 
min = (STATS_min_y < STATS_min_x ? STATS_min_y : STATS_min_x) 
min = (STATS_max_y > STATS_max_x ? STATS_max_y : STATS_max_x) 

sc = 1.05 
set xrange[sc*min:sc*max] 
set yrange[sc*min:sc*max] 
set size ratio -1 

plot 'datafile' 
+0

Grazie per la soluzione. Questo metodo è piuttosto frustrante, tuttavia, poiché sto usando 'multiplot' per tracciare 4 grafici da diverse colonne nel file di dati. dovendo fare questo per ogni set di dati non è l'ideale, ma praticabile. – Rohan

+0

Sì, davvero. Ho aggiornato la mia risposta per mostrarvi come è possibile inserire tutto questo in una stringa e usare 'eval' per renderlo riutilizzabile. – Christoph

Problemi correlati