0. Índice de contenidos.
1. Introducción
Como vimos en otro tutorial es muy sencillo 
exportar datos a una hoja de cálculo mediante Apache POI.
 Sin embargo, las hojas de cálculo no son la única solución para la 
exportación de datos. En determinados casos puede ser muy interesante 
plasmar toda esa información en una gráfica.
En este tutorial vamos a ver cómo generar gráficas con series de datos 
con ayuda de la librería JFreeChart. Para ello vamos a aprovechar los 
datos del ejemplo que utilizamos en el 
tutorial anteriormente mencionado.
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro 15' (2.2 Ghz Intel Core I7, 4GB DDR3).
- Sistema Operativo: Mac OS Snow Leopard 10.6.7
- Entorno de desarrollo: Eclipse 3.7 Indigo.
- JFreeChart 1.0.13.
3. Diseñando la gráfica.
Como hemos dicho anteriormente, nos vamos a basar en datos de pilotos 
que dan vueltas de entrenamiento a un circuito para generar este 
ejemplo. Las características que tendrá nuestra gráfica serán las 
siguientes:
- Cada serie (de tiempos por vuelta de un piloto) se representará de forma lineal.
- El eje Y de la gráfica mostrará los tiempos en segundos en un rango 
de 120 a 135. El número de segundos del eje se visualizará de dos en dos
 (120, 122, 124...).
- El eje X de la gráfica mostrará el número de vueltas, de la vuelta 1 a la vuelta 5.
- Cada punto de la gráfica debe de mostrarse con un círculo 
(evidentemente los círculos serán unidos por la línea que representará 
la serie).
- Los colores de las series deben ser distintos, así como las líneas 
de la gráfica que hacen de guía (líneas discontinuas que salen en el 
fondo de la gráfica).
- En el pie de la gráfica debe figurar una leyenda con los nombres de los pilotos.
4. Construyendo la gráfica.
Pues bien, aquí tenemos la clase que nos generará la gráfica:
| 03 | importorg.jfree.chart.ChartFactory; | 
 
| 04 | importorg.jfree.chart.ChartUtilities; | 
 
| 05 | importorg.jfree.chart.JFreeChart; | 
 
| 06 | importorg.jfree.chart.axis.NumberAxis; | 
 
| 07 | importorg.jfree.chart.axis.NumberTickUnit; | 
 
| 08 | importorg.jfree.chart.plot.PlotOrientation; | 
 
| 09 | importorg.jfree.chart.plot.XYPlot; | 
 
| 10 | importorg.jfree.chart.renderer.xy.XYLineAndShapeRenderer; | 
 
| 11 | importorg.jfree.data.xy.XYSeries; | 
 
| 12 | importorg.jfree.data.xy.XYSeriesCollection; | 
 
| 14 | publicclassPruebaJFreeChart { | 
 
| 16 |     privatestaticColor COLOR_SERIE_1 = newColor(255, 128, 64); | 
 
| 18 |     privatestaticColor COLOR_SERIE_2 = newColor(28, 84, 140); | 
 
| 20 |     privatestaticColor COLOR_RECUADROS_GRAFICA = newColor(31, 87, 4); | 
 
| 22 |     privatestaticColor COLOR_FONDO_GRAFICA = Color.white; | 
 
| 24 |     publicJFreeChart crearGrafica(XYSeriesCollection dataset) { | 
 
| 26 |         finalJFreeChart chart = ChartFactory.createXYLineChart("Tiempos de entrenamientos", "Vuelta", "Tiempo (segundos)",  | 
 
| 28 |                 PlotOrientation.VERTICAL,  | 
 
| 34 |         chart.setBackgroundPaint(COLOR_FONDO_GRAFICA); | 
 
| 36 |         finalXYPlot plot = (XYPlot) chart.getPlot(); | 
 
| 39 |         finalNumberAxis domainAxis = (NumberAxis)plot.getDomainAxis(); | 
 
| 40 |         configurarDomainAxis(domainAxis); | 
 
| 42 |         finalNumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis(); | 
 
| 43 |         configurarRangeAxis(rangeAxis); | 
 
| 45 |         finalXYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer)plot.getRenderer(); | 
 
| 46 |         configurarRendered(renderer); | 
 
| 52 |     privatevoidconfigurarPlot (XYPlot plot) { | 
 
| 53 |         plot.setDomainGridlinePaint(COLOR_RECUADROS_GRAFICA); | 
 
| 54 |         plot.setRangeGridlinePaint(COLOR_RECUADROS_GRAFICA); | 
 
| 58 |     privatevoidconfigurarDomainAxis (NumberAxis domainAxis) { | 
 
| 59 |         domainAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); | 
 
| 60 |         domainAxis.setTickUnit(newNumberTickUnit(1)); | 
 
| 64 |     privatevoidconfigurarRangeAxis (NumberAxis rangeAxis) { | 
 
| 65 |         rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); | 
 
| 66 |         rangeAxis.setTickUnit(newNumberTickUnit(2)); | 
 
| 67 |         rangeAxis.setRange(120, 135); | 
 
| 71 |     privatevoidconfigurarRendered (XYLineAndShapeRenderer renderer) { | 
 
| 72 |         renderer.setSeriesShapesVisible(0, true); | 
 
| 73 |         renderer.setSeriesShapesVisible(1, true); | 
 
| 74 |         renderer.setSeriesPaint(0, COLOR_SERIE_1); | 
 
| 75 |         renderer.setSeriesPaint(1, COLOR_SERIE_2); | 
 
 
 
Bien, como vemos el método ChartFactory.createXYLineChart nos creará una gráfica de series representadas por líneas.
El método configurarPlot se ocupa de establecer el color de las líneas 
de fondo de la gráfica que hacen de guía. Son las líneas discontinuas 
verticales y horizontales que aparecen en el fondo de la gráfica. 
El método configurarDomainAxis actua sobre el eje X, el eje del número 
de vueltas, y hace que se muestren números enteros y de uno en uno.
El método configurarRangeAxis actua sobre el eje Y, el de los tiempos, y
 hace que se muestren los tiempos comprendidos en el rango de 120 a 135 
pero mostrando un número si, un número no.
El método configurarRndered hace que en cada punto (relación tiempo - 
vuelta de una serie) se muestre un círculo y que cada serie sea de un 
color.
5. Ejecutando el ejemplo.
Por último, nos queda cargar los datos de los pilotos (usaremos los del otro tutorial) y generar la gráfica en un fichero.
| 01 | publicstaticfinalintANCHO_GRAFICA = 400; | 
 
| 03 | publicstaticfinalintALTO_GRAFICA = 300; | 
 
| 05 | publicstaticvoidmain(String args[]) { | 
 
| 07 |     finalXYSeries serie1 = newXYSeries("Fernando Alonso"); | 
 
| 08 |     serie1.add(1, 131.78); | 
 
| 09 |     serie1.add(2, 129.95); | 
 
| 10 |     serie1.add(3, 128.16); | 
 
| 11 |     serie1.add(4, 125.91); | 
 
| 12 |     serie1.add(5, 130.44); | 
 
| 14 |     finalXYSeries serie2 = newXYSeries("Jaime Alguersuari"); | 
 
| 15 |     serie2.add(1, 133.16); | 
 
| 16 |     serie2.add(2, 132.32); | 
 
| 17 |     serie2.add(3, 129.86); | 
 
| 18 |     serie2.add(4, 128.02); | 
 
| 19 |     serie2.add(5, 132.45); | 
 
| 21 |     finalXYSeriesCollection collection = newXYSeriesCollection(); | 
 
| 22 |     collection.addSeries(serie1); | 
 
| 23 |     collection.addSeries(serie2); | 
 
| 26 |         finalPruebaJFreeChart prueba = newPruebaJFreeChart(); | 
 
| 27 |         finalJFreeChart grafica = prueba.crearGrafica(collection); | 
 
| 28 |         ChartUtilities.saveChartAsPNG(newFile("tiempos-entrenamientos.png"), grafica, ANCHO_GRAFICA, ALTO_GRAFICA); | 
 
| 29 |     } catch(Exception e) { | 
 
 
 
Observemos que añadimos los tiempos de cada piloto en una serie llamada 
XYSeries. A esta serie únicamente le indicamos el nombre, que se 
corresponderá con el nombre del piloto, y el tiempo por vuelta. Ej: en 
la serie 1 hemos indicado que en la vuelta 1 el tiempo fue de 131.78 
segundos, en la vuelta 2 fue de 129.95, etc...
Añadimos las gráficas a un dataset de tipo XYSeriesCollection y se lo pasamos al método crearGrafica.
Por último, con el método saveChartAsPNG de la clase ChartUtilities 
generamos una imagen en formato png, con el alto y ancho que queramos y 
que que dará como resultado una imagen llamada 
tiempos-entrenamiento.png. La gráfica resultante es la siguiente:
 
6. Referencias.
7. Conclusiones.
En este tutorial hemos visto lo sencillo que es generar gráficas de series lineales con ayuda de la librería JFreeChart.
Nótese que esta librería es capaz de generar una gran cantidad de tipos 
de gráficas que pueden verse en la demo de su página web.
 
No hay comentarios:
Publicar un comentario