2010-07-26 34 views
6

He estado utilizando Incanter para mis necesidades de gráficos, que era adecuada pero lenta para mis necesidades anteriores.Biblioteca rápida de gráficos

Ahora necesito incrustar un gráfico en un JPanel. Los usuarios necesitarán interactuar con el gráfico (por ejemplo, haciendo clic en ciertos puntos que el programa necesitaría recibir y tratar) arrastrando y haciendo clic. Zoom en un out es imprescindible también.

He oído hablar de JFreeChart en otras discusiones SO, pero veo que Incanter lo usa como su motor de gráficos, y parecía algo lento entonces. ¿Es realmente rápido, pero quizás Incanter está haciendo cosas que lo ralentizan?

Estoy haciendo gráficos de hasta 2 millones de puntos (tramas xy simples, en realidad), aunque en general estarán menos gráficas. Usando Matlab, esto se traza en unos pocos segundos, pero Incanter puede colgar durante minutos.

¿Entonces es JFreeChart el camino a seguir? ¿O algo más, teniendo en cuenta mis necesidades?

(también, tiene que ser libre, como lo es para la investigación.)

+1

Alternativas a JFreeChart: http: // java- source.net/open-source/charting-and-reporting – h3xStream

Respuesta

5

Desafortunadamente, las soluciones gráficas de propósito general, probablemente no van a escalar bien a 2 millones de puntos - que es lo suficientemente grande que necesitará algo especializado si quieres un rendimiento interactivo.

puedo ver algunas opciones sensatas:

  • escribir su propia función personalizada "plotter" que está optimizado para la elaboración de un gran número de puntos. Tendría que probarlo, pero creo que podría obtener el rendimiento que desea escribiendo los puntos directamente en una Imagen Buffered usando setRGB en un ciclo cerrado. Si aún así no es lo suficientemente rápido, puede escribir los puntos directamente en una matriz de bytes y construir un MemoryImageSource.

  • Excluya los puntos para que solo esté dibujando, p. 10,000 puntos máximo. Esto puede ser perfectamente aceptable siempre que solo se preocupe por la forma general de la gráfica de dispersión en lugar de los puntos individuales.

  • Preprocesar todos los puntos en, p. Ej. una imagen Buffered grande que permite a los usuarios acercarse y alejarse/interactuar con esta imagen estática. Es posible que pueda "hackear" JFreeChart para hacer esto.

  • Si OpenGL es una opción (¡requerirá código nativo + una curva de aprendizaje pronunciada!), Suelte todos los puntos en una gran matriz de vértices y obtenga la tarjeta gráfica para hacerlo todo por usted. Manejará 2 millones de puntos en tiempo real sin ninguna dificultad.

+0

Gracias por el consejo: podría considerar usar OpenGL o solo dibujar tantos puntos como se necesiten en un momento determinado. Sin embargo, MatLab parece manejar alrededor de 1-2 millones de puntos bastante bien, y esto es en un Dell viejo y malo. – Isaac

+0

Puede reducir el número de puntos arbitrariamente mientras mantiene la forma general usando el algoritmo Douglas-Peucker: http://en.wikipedia.org/wiki/Ramer- Douglas-Peucker_algorithm – sanityinc

+0

@Isaac - Espero que MatLab internamente utilice algo así como uno de los enfoques que mencioné. – mikera

1

MathGL es librerías gráficas rápidas y gratuitas (GPL). Pero nunca pruebo su interfaz java (basado en swig) ya que no estoy familiarizado con java :(. Por lo tanto, si alguien puede ayudarme con las pruebas, estaré agradecido.

Cuestiones relacionadas