Visualizar datos y generar gráficas en Java con JFreeChart

Escrito por el .
java planeta-codigo programacion
Enlace permanente Comentarios

Visualizar datos de forma gŕafica ayuda a comprender un conjunto de datos grande mucho mejor que leyendo los valores en una tabla con varias columnas. En Java con la librería JFreeChart podemos generar gráficas de diferentes tipos que podremos incluir en los archivos pdf que generemos en un aplicación o podremos mostrar en forma de imagen en el navegador si se trata de una aplicación web.

Java

Una de las principales tareas de las aplicaciones informáticas es manejar información, almacenar y recuperar datos de diversos tipos según sea el ámbito de la información tratada. Ejemplos podrían ser datos meteorológicos como temperatura, presión, velocidad y dirección del viento o datos poblacionales como número de personas, hombres y mujeres, nativos y extranjeros, … todos estos datos se pueden recoger a lo largo del tiempo. Al recuperar los datos y presentarlos los datos se pueden presentar de forma tabular con las cifras tal y como están guardadas, sin embargo, esta forma hace difícil comprender los datos ¿si queremos ver como han evolucionado los datos meteorológicos durante un periodo de tiempo? ¿si queremos ver el porcentaje de población que le corresponde a cada comunidad autónoma respecto al total o como ha variado en varios años? Visualizar la información de forma gráfica nos ayuda a visualizar y comprender mejor un gran volumen de datos en mucho menos tiempo. Una vez comprendida la información se extraen tendencias de algunos datos e información útil que ayuden a tomar decisiones.

Estos son los datos de la evolución de cuota de uso entre los usuarios de tres de los principales navegadores desde el 2007 hasta el 2017. Viendo la tabla es más difícil observar la tendencia de cada uno de ellos y como se relacionan los datos con el resto navegadores. En una gráfica se observaría que Internet Explorer tiene una tendencia descendente, Firefox ascendente hasta el nacimiento de Chrome y este continuamente ascendente mientras las otras opciones pierden usuarios

Browser 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
Internet Explorer 67.7 63.1 60.2 50.6 41.1 31.8 27.6 20.4 17.3 12.3 8.1
Firefox 25 29.1 32.1 32.9 31.9 25.5 20.1 18.4 15.3 11.4 9.5
Chrome 0.2 6.4 14.6 25.3 30.1 34.3 43.2 47.3 58.4

JFreeChart es una librería Java que permite generar gráficas de diferentes tipos con la que visualizar datos. Con esta librería de software libre que tiene una licencia LGPL es posible generar gráficas de histograma, de área, de barras, de barras apiladas, con ejes combinados, financieras, de Gantt, de líneas, diales, con múltiples ejes, sobrepuestas, tartas, estadísticas, de series temporales, xy y otros tipos, a algunas es posible darles un aspecto en tres dimensiones. Las gráficas las podemos exportar a archivos de imagen png, jpg o formatos escalares como svg con lo que serán utilizables de múltiples formas, por ejemplo, incluyendo las gráficas en archivos PDF o si la aplicación es una aplicación web devolver las imágenes al navegador para que las visualice, usando JasperReports para generar informes es posible incluir las imágenes generadas por JFreeChart.

Desde la propia página web de JFreeChart es posible ejecutar una aplicación Java Web Start de demostración que contiene múltiples ejemplos con datos para ver como son los diferentes tipos de gráficas, en la librería hay un archivo jar con la misma aplicación de demostración junto con el código fuente de algunos ejemplos. En el Javadoc está la documentación con la API ofrecida por la librería. El autor de la librería ofrece una guía en formato PDF y el código fuente de los ejemplos pero estos son de pago. La última versión tiene unos años pero es compatible con Java 1.6.

1
2
$ java -jar jfreechart-1.0.19-demo.jar

demo.sh

Gráfica de tarta Gráfica de coordenadas polares

Gráfica de barras apiladas Gráfica de series

Ejemplos de gráficas

Este sería el código fuente de un ejemplo sencillo para una gráfica varias series datos. En el ejemplo primeramente se crear el conjunto de datos, el Dataset de la gráfica, se establecen algunos estilos de visualización con XYLineAndShapeRenderer, con la clase factoría ChartFactory se obtiene la gráfica proporcionándole los datos y finalmente generan un archivo en formato png en un archivo, también se podría generar en un OutputStream si fuese el caso de una aplicación web que quisiera enviar la imagen al navegador del cliente o también para incluir la imagen en un archivo PDF.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package io.github.picodotdev.blogbitix.jfreechart;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Main {

    public static void main(String[] args) throws Exception {
        DefaultXYDataset dataset = new DefaultXYDataset();
        dataset.addSeries("firefox", new double[][] {{ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 }, { 25, 29.1, 32.1, 32.9, 31.9, 25.5, 20.1, 18.4, 15.3, 11.4, 9.5 }});
        dataset.addSeries("ie", new double[][] {{ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 }, { 67.7, 63.1, 60.2, 50.6, 41.1, 31.8, 27.6, 20.4, 17.3, 12.3, 8.1 }});
        dataset.addSeries("chrome", new double[][] {{ 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 }, { 0.2, 6.4, 14.6, 25.3, 30.1, 34.3, 43.2, 47.3, 58.4 }});

        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        renderer.setSeriesPaint(0, Color.ORANGE);
        renderer.setSeriesPaint(1, Color.BLUE);
        renderer.setSeriesPaint(2, Color.GREEN);
        renderer.setSeriesStroke(0, new BasicStroke(2));
        renderer.setSeriesStroke(1, new BasicStroke(2));
        renderer.setSeriesStroke(2, new BasicStroke(2));

        JFreeChart chart = ChartFactory.createXYLineChart("Browser Quota", "Year", "Quota", dataset);
        chart.getXYPlot().getRangeAxis().setRange(0, 100);
        ((NumberAxis) chart.getXYPlot().getRangeAxis()).setNumberFormatOverride(new DecimalFormat("#'%'"));
        chart.getXYPlot().setRenderer(renderer);

        BufferedImage image = chart.createBufferedImage(600, 400);
        ImageIO.write(image, "png", new File("xy-chart.png"));
    }
}
Main.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apply plugin: 'java'
apply plugin: 'application'

repositories {
    jcenter()
}

dependencies {
    compile 'org.jfree:jfreechart:1.0.19'
    compile 'org.jfree:jcommon:1.0.23'
}

mainClassName = 'io.github.picodotdev.blogbitix.jfreechart.Main'

build.gradle

Gráfica de series

Gráfica de series

En JavaScript también hay librerías para generar gráficas pero para casos complejos y con muchos datos probablemente sea mejor idea generar las gráficas en el lado del servidor que enviar todos los datos que necesite la gráfica al cliente. En GNU/Linux disponemos del programa gnuplot usable desde la línea de comandos y por tanto desde cualquier lenguaje que tenga la capacidad de ejecutar comandos del sistema, ejecutar un comando del sistema con Java de gnuplot para que nos generase la gráfica. Hay varias posibilidades para visualizar de forma gráfica la información.

Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Comparte el artículo: