2009-02-03 41 views
7

Tengo grandes conjuntos de datos (datos de 10 Hz, por lo que 864k puntos por 24 horas) que necesito trazar en tiempo real. La idea es que el usuario pueda acercarse y moverse en diagramas de dispersión altamente detallados.Cómo trazar grandes vectores de datos con precisión en todos los niveles de zoom en tiempo real?

Los datos no son muy continuos y hay picos. Dado que el conjunto de datos es tan grande, no puedo trazar cada punto cada vez que se actualiza el trazado.

Pero tampoco puedo trazar cada enésimo punto o de lo contrario perderé características importantes como espigas grandes pero cortas.

Matlab lo hace bien. Puede darle un vector de 864k lleno de ceros y simplemente establecer un punto en 1 y trazará correctamente en tiempo real con los zoom y las vistas.

¿Cómo lo hace Matlab?

Mi sistema de destino es Java, así que estaría generando vistas de este diagrama en Swing/Java2D.

+0

Realmente no entiendo lo que estás preguntando aquí. ¿Podría agregar un ejemplo de código de cómo está trazando los datos en MATLAB? – gnovice

+0

¿Su pregunta es una pregunta de Java o una pregunta de Matlab? –

+0

Me pregunto cómo lo hace Matlab, así que lo reproduzco en Java – Pyrolistical

Respuesta

4

Usted debe tratar el archivo de MATLAB central:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot-downsampled-plot

Del autor:

Esta versión de "trama" le permitirá visualizar los datos que tiene una gran cantidad de elementos Trazar un gran conjunto de datos hace que sus gráficos sean lentos, pero la mayoría de las veces no necesita toda la información que se muestra en el diagrama. Su pantalla solo tiene tantos píxeles, y sus ojos no podrán detectar ninguna información no capturada en la pantalla.

Esta función reducirá la resolución de los datos y representará solo un subconjunto de los datos, mejorando así los requisitos de memoria. Cuando se amplía la trama, se muestra más información. Se hace algo de trabajo para asegurarse de que se capturen los valores atípicos.

Sintaxis:

dsplot(x, y) 
dsplot(y) 
dsplot(x, y, numpoints) 

Ejemplo:

x =linspace(0, 2*pi, 1000000); 
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x); 
dsplot(x,y1); 
2

No sé cómo lo hace Matlab, pero me gustaría empezar con Quadtrees.

Vuelca todos tus puntos de datos al quadtree, luego para renderizar a un nivel de zoom dado, caminas por el quadtree (comenzando por las áreas que se superponen a lo que estás viendo) hasta llegar a áreas que son comparables al tamaño de un pixel Pegue un píxel en el medio de esa área.

añadido: Hacer su dibujo con OpenGL/JOGL también lo ayudará a obtener un dibujo más rápido. Especialmente si puede predecir panoramización, y acumular los puntos para mostrar en una lista de visualización o algo así, para que no tenga que hacer ningún trabajo de CPU para los nuevos marcos.

0

10Hz de datos significa que solo tiene que trazar 10 fotogramas por segundo. Debería ser fácil, ya que muchos juegos alcanzan> 100 fps con gráficos mucho más complejos.

Si traza 10 píxeles por segundo para cada punto de datos posible, puede visualizar un minuto de datos usando un widget de 600 píxeles de ancho. Si guarda el índice de la 600ma última muestra, será fácil dibujar solo los datos más recientes.

Si no tiene un nuevo punto de datos cada 10 segundos, tiene que encontrar una forma de insertar un punto de datos interpolado. Tres opciones vienen a la mente:

  1. Repita el último punto de datos.
  2. Inserta un punto de datos "vacío". Esto causará lagunas en el gráfico.
  3. No actualice el gráfico hasta que llegue el siguiente punto de datos. Luego inserte todos los píxeles que no dibujó de una vez, con interpolación lineal entre los puntos de datos.

Para hacer la animación sin problemas use double-buffering. Si su idioma de destino es compatible con un widget de lienzo, probablemente sea compatible con el doble almacenamiento en búfer.

Al hacer zoom, tiene las mismas tres opciones que anteriormente, ya que los puntos de datos ampliados no son continuos, incluso si los puntos de datos originales fueron.

This podría ayudar a implementarlo en Java.

+0

Lo siento, cuando dije "tiempo real", quise decir que el trazado debe ocurrir en tiempo de lectura, pero los datos son estáticos. – Pyrolistical

Cuestiones relacionadas