2011-01-25 15 views
5

Actualmente estoy usando gnuplot para trazar los datos en una línea de tiempo. Sin embargo, la precisión de la línea de tiempo se expresa en milisegundos, pero gnuplot solo parece ser capaz de manejar segundos.alternativa de gnuplot con mayor precisión de tiempo

He visto un par de alternativas, pero en realidad solo necesito algo como gnuplot que pueda soportar fracciones de segundo.

El lenguaje de programación utilizado para el guión principal es Python y, si bien he examinado matplotlib, parece ser mucho más 'heavy duty' que gnuplot. Como no siempre seré el que está actualizando el lado gráfico de las cosas, quiero que sea lo más fácil posible.

¿Alguna sugerencia?

actualización

estoy usando esto con gnuplot:

set xdata time 
set timefmt "%Y-%m-%d-%H:%M:%S" 

Sin embargo no hay% f para obtener milisegundos. Por ejemplo, esto funciona:

2011-01-01-09:00:01 

pero necesito:

2011-01-01-09:00:01.123456 
+2

Podría publicar un fragmento de los datos que está tratando de trazar y los comandos que está utilizando? gnuplot no debería preocuparse por las unidades, ¿cómo sabe si son segundos o milisegundos, después de todo? - así que no estoy muy seguro de lo que está haciendo o no haciendo, que no es lo que quieres. – DSM

+0

El timefmt más pequeño es un segundo porque un minuto tiene 60 segundos y necesita ser manejado especialmente. Con milisegundos, no entiendo cuál es el problema. – Tom

+0

Ah, entiendo el problema ahora, sí, esto realmente es un problema y no creo que haya una solución elegante. – Tom

Respuesta

10

puede establecer el formato de las garrapatas con

set format x '%.6f' 

o (tal vez, no lo he probado, ya que ahora prefiero usar Matplotlib y no tiene gnuplot instalado en mis máquinas):

set timefmt "%Y-%m-%d-%H:%M:%.6S" 

(tenga en cuenta el número de dígitos especificado junto con la cadena %S formato).

Más detalles se pueden encontrar en el excelente not so Frequently Asked Questions.

+1

Esto no funciona para mí. Copié los datos de la publicación original y emití tu 'set timefmt"% Y-% m-% d-% H:% M:%. 6S'. Mientras que este formato es aceptado, cuando ejecuto el comando 'plot' I get 'warning: formato de tiempo incorrecto en string' en todos los puntos de datos. –

+1

Si elimino el' .6' del timefmt y luego elimino las posiciones decimales de mis datos, entonces funcionará. gnuplot en realidad no parece estar capaz de manejar segundos no enteros –

+3

@thoughtadvances gnuplot 4.6 interpretará '% S' como un' doble', lo que significa que los segundos fraccionarios se interpretan correctamente. –

1

estoy usando gnuplot para los mismos fines, mi entrada se parece a:

35010.59199,100,101
35010,76560, 100,110
35011.05703,100,200
35011.08119,100,110
35011.08154,100,200
35011.08158,100,200
35011.08169,100,200
35011.10814,100,200
35011.16955,100,110
35011.16985,100,200
35011.17059,100,200

La primera columna es segundos desde la medianoche y después de la coma una parte nanosegundo. Puede guardar esto en un archivo CSV y en gnuplut hacer:

set datafile separator ',' 
plot "test.csv" using 1:3 with lines 
1

Originalmente entendí mal su problema. Creo que la resolución más fina al formato de hora es un gran problema con gnuplot y uno que, hasta donde sé, no está implementado.

Una posible solución alternativa sería usar awk para convertir la fecha en el número de segundos con algo como

plot "<awk 'your_awk_one_liner' file1.dat" with lines 

y luego simplemente hacer una doble normal con un doble trama y olvidar que fue cada vez en absoluto (un poco como la solución de Martin). Me temo que no soy muy bueno con awk y por eso no puedo ayudar con este bit - estas páginas pueden ayudar - http://www.gnu.org/manual/gawk/html_node/Time-Functions.html y http://www.computing.net/answers/unix/script-to-convert-datetime-to-seco/3795.html. El uso de awk con gnuplot se describe aquí: http://t16web.lanl.gov/Kawano/gnuplot/datafile3-e.html.

entonces se podría trazar un segundo eje (y no los datos) con los tiempos correctos - algo así como el método utilizado aquí: Is there a way to plot change of day on an hourly timescale on the x axis?

Me temo que no tengo tiempo para tratar de escribir una completa solución, pero algo razonable debería ser posible.

Buena suerte - manténganos actualizados si obtienes algo que funcione - Me interesaría.

9

Según la gnuplot 4.6 manual se afirma, en "Hora/fecha especificadores" (página 114 de la gnuplot 4.6 PDF):

% S - segundos, número entero de 0-60 en la salida, (doble) en entrada

lo que esto significa es que cuando la lectura de las marcas de tiempo tal como 2013-09-16 09:56:59.412 la parte fraccionaria se incluirá como parte de la %S especificador. una marca de tiempo tal será tratada correctamente con:

set timefmt "%Y-%m-%d %H:%M:%S" 
set datafile separator "," 
plot "timed_results.data" using 1:2 title 'Results' with lines 

y se alimenta con datos como:

2013-09-16 09:56:53.405,10.947 
2013-09-16 09:56:54.392,10.827 
2013-09-16 09:56:55.400,10.589 
2013-09-16 09:56:56.394,9.913 
2013-09-16 09:56:58.050,11.04 
+0

Esta es una muy buena respuesta y aborda directamente la cuestión en cuestión - Cómo tener los valores de milisegundos reconocidos por gnuplot ... + ve 1 aquí. – Xofo

+0

Esta debería ser la respuesta aceptada. He estado usando esta solución con éxito. – Xofo

+0

Esto funciona para encontrar datos de tiempo de lectura, pero no tan bien para escribirlo.Por ejemplo, 'establecer formato x"% H:% M:% S "', combinado con datos dentro del mismo segundo da como resultado todos los x tics etiquetados con el mismo valor. Por ejemplo, uno recibe "09:56:53", "09:56:53", "09:56:53" en lugar de "09: 56: 53.4", "09: 56: 53.5", "09:56: 53.6 ". – TrentP

Cuestiones relacionadas