2012-05-30 17 views
7

Por qué cuando hago este código de gnuplot es un trabajo:Todos los puntos y valor undefined en gnuplot

set terminal postscript enhanced color 
set output '../figs/ins_local.ps' 

set title "Result" 

set logscale y 
set xrange [50:100] 
set xtics 5 

#set xlabel "Insertion" 
#set ylabel "Time (in microseconds) " 

plot sin(x) 

pero cuando cambio plot sin(x) con:

plot "../myFile.final" with lines title "Somethings" lw 3 linecolor rgb "#29CC6A" 

tengo este error:

plot "../myFile.final" with lines title "Somethings" lw 3 linecolor rgb "#29CC6A" 
                          ^
"local.gnuplot", line 16: all points y value undefined 

¡Tengo juste una columna! lo represente yrange. xrange se representa por número de línea! ejemplo de mi punto de datos:

125456 
130000 
150000 

primer punto de x es 1, segundo punto de x es 2, y el último es 3. Ahora quiero Représente este 1, 2, 3 por una escala de 50, 55, 60 !

+0

¿Cuáles son los contenidos de '../ myFile.final'? – mgilson

+0

¡Está fuera del directorio actual! una forma de mi contenido es verdad! – Mehdi

Respuesta

16

Hay algunas cosas que podrían estar fallando aquí: sin ver su archivo de datos es imposible saberlo. Una pareja que puedo pensar en la parte superior de mi cabeza son:

Todos los puntos de datos en la columna 2 están a menos de o igual a 0 (aparece el mensaje de error porque log (0) no está definido)

No tiene ningún punto en la primera columna entre 50 y 100. En este caso, todos sus puntos de datos quedan recortados del rango de trazado debido a set xrange [50:100]

Su archivo de datos solo tiene 1 columna ... En este caso , gnuplot no ve ningún valor y. (Cambiar a plot '../myFile.final' u 1 ...)

EDITAR

Ok, ahora que veo el fichero de datos, el problema es, sin duda que usted tiene set xrange [50:60] pero tu de datos xrange sólo se ejecuta de 0 a 2 (gnuplot se inicia la indexación de ficheros de datos de 0). La forma más fácil de solucionar este problema es utilizar la pseudo-columna 0. Pseudo-columna 0 es simplemente el número de línea a partir de 0 (que es lo que gnuplot parcelas en el eje x si lo hace plot 'blah.txt' using 1 He aquí un ejemplo:.

scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,0,2)):1 w lines title "scaled xrange" 

Tenga en cuenta que si usted no sabe cómo funciona el uso de la especificación, números precedidos por $ son operaciones elemento a elemento en toda esa columna por ejemplo:.

plot 'foo.bar' using 1:($2+$3) 

se trace la primera columna más la suma de el segundo y tercer elementos en cada fila del archivo de datos.

Esta solución asume que usted conoce el valor máximo de x en su archivo de datos (en este caso, eso es 3-1 = 2 - [tres puntos, 0,1,2]). Si no conoce la cantidad de puntos de datos, puede obtenerlos mediante el uso de shell magic o directamente desde gnuplot. La primera forma es un poco más fácil, aunque no tan portátil. Voy a mostrar tanto:

XMAX=`wc -l datafile | awk '{print $1-1}'` 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,0,XMAX)):1 w lines title "scaled xrange" 

La segunda manera, tenemos que hacer dos pasos por los datos y dejar que gnuplot recoger el máximo:

set term push #save terminal settings 
set term unknown #use unknown terminal -- doesn't actually make a plot, only collects stats 
plot 'test.dat' u 0:1 #collect stats 
set term pop #restore terminal settings 
XMIN=GPVAL_X_MIN #should be 0, set during our first plot command 
XMAX=GPVAL_X_MAX #should be number of lines-1, collected during first plot command 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange" 

supongo que esté completo, debería decir que esto también es más fácil de hacer en gnuplot 4.6 (no tengo instalado en este momento, por lo que la siguiente parte simplemente viene de mi comprensión de los documentos):

stats 'test.dat' using 0:1 name "test_stats" 
#at this point, your xmin/xmax are stored in the variables "test_stats_x_min"/max 
XMIN=test_stats_x_min 
XMAX=test_stats_x_max 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange" 

Gnuplot 4.6 se ve muy bien. Probablemente empezaré a jugar con eso muy pronto.

+0

tengo editar mi publicación :) – Mehdi

+0

@Mehdi - He editado mi publicación también. Es bastante detallado, pero con suerte es bastante comprensible. – mgilson

+0

Genial, es trabajo, una última pregunta, por favor: cuando haga: 'plot 'test.dat' using (scale_x ($ 0,50,60, XMIN, XMAX)): 1' ¿Qué significa:': 1 ¿? – Mehdi

Cuestiones relacionadas