Gráficas en Java con JFreeChart

4
152706

Gráficas en Java con JFreeChart

Una aplicación sin gráficas es muy sosa… y normalmente nuestros clientes
lo agradecen.

Hay muchas librerías de pago y gratuitas para realizar esta labor.
Vamos a mostraros como crear una gráfica simple con una de las librerías más extendidas.

Hemos elegido en este caso JFreeChart y os vamos a mostrar distintas
posibilidades de uso.

Descomprimimos los datos en el directorio deseado

Podemos ejecutar una demostración y ver las posibilidades ….

java -jar jfreechart-0.9.10-demo.jar

Si pinchamos uno de los dibujos ..podemos ver las capacidades
….

Nosotros vamos a tratar de realizar un ejemplo simple …y la
unica dificultad que he encontrado es la poca documentación disponible (jeje,
que se puede comprar )

Aparte de descargarnos JFreeChart, hay que descargarse otra
librería llamada jcommun

En NetBean incluimos los dos jars ….

E introducimos el código .. como vemos es reducido… en verde
el particular para pintar la gráfica

/*
 * ventanaGrafica.java
 *
 * Created on 9 de agosto de 2003, 9:11
 */
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;

/**
 *
 * @author  Roberto Canales
 */
public class ventanaGrafica extends java.awt.Frame {

    BufferedImage grafica = null;

    /** Creates new form ventanaGrafica */
    public ventanaGrafica() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pack();
    }

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

        ventanaGrafica miventana = new ventanaGrafica();
        miventana.setSize(400,400);
        miventana.show();
    }

    public BufferedImage creaImagen()
    {
        XYSeries series = new XYSeries("Evolucion");
        series.add(1, 23);
        series.add(2, 34);
        series.add(3, 51);
        series.add(4, 67);
        series.add(5, 89);
        series.add(6, 121);
        series.add(7, 137);
        XYDataset juegoDatos= new XYSeriesCollection(series);

        JFreeChart chart = ChartFactory.createLineXYChart
        ("Sesiones en Adictos al Trabajo",
        "Meses","Sesiones",juegoDatos,PlotOrientation.VERTICAL,
        false,
        false,
        true                // Show legend
        );

         BufferedImage image = chart.createBufferedImage(300,300);
        return image;
    }

    public void paint(java.awt.Graphics g) {
        //super.paint(g);

        if(grafica == null)
        {
            grafica = this.creaImagen();
        }
        g.drawImage(grafica,30,30,null);
    }

}

    

El resultado de nuestro ejemplo es:

Otra posibilidad… con este ejemplo tan simple … podría ser
crear un servlet …. que retorne la imagen ….

 

El mejor modo para seguir avanzando es .. o comprar la
documentación …. o hacer introspección de los ejemplos que trae ….

Si queremos generar las gráficas desde un Servlet… es igual
de sencillo … auque no debemos olvidadar incluir en los
ficheros .jar
de JFreeChart

/*
 * ejemploGraficasServlet.java
 *
 * Created on 10 de agosto de 2003, 14:25
 */

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;

/**
 *
 * @author  Roberto Canales
 * @version
 */
public class ejemploGraficasServlet extends HttpServlet
{

    public JFreeChart crearChart()
    {
        XYSeries series = new XYSeries("Evolucion Sesiones");
        series.add(1, 23);
        series.add(2, 34);
        series.add(3, 51);
        series.add(4, 67);
        series.add(5, 89);
        series.add(6, 121);
        series.add(7, 137);
        XYDataset juegoDatos= new XYSeriesCollection(series);

        JFreeChart chart = ChartFactory.createLineXYChart("Sesiones en Adictos al Trabajo",
        "Meses", "Sesiones", juegoDatos,
        PlotOrientation.VERTICAL,
        true,true,true
        );

        return chart;
    }


    int getParamEntero(HttpServletRequest request,String pNombre, int pDefecto)
    {
            String param = request.getParameter(pNombre);

            if (param == null || param.compareTo("") == 0)
            {
                return pDefecto;
            }

            return Integer.parseInt(param);

    }


    /** Processes requests for both HTTP GET and POST methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("image/jpeg");
      
        OutputStream salida = response.getOutputStream();
        JFreeChart grafica = crearChart();

        int ancho = getParamEntero(request,"ancho",400);
        int alto = getParamEntero(request,"alto",300);

        ChartUtilities.writeChartAsJPEG(salida,grafica,ancho,alto);

        salida.close();
    }

    /** Handles the HTTP GET method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

}

    

Vemos el resultado …

Y podemos cambiar los parámetro y vemos lo rápido que se
generan nuestras gráficas

Normalmente, los datos querremos cogerlos de algun sitio
externo, como una base de datos …..

Vamos a crear una tabla en MySQL … podéis ver como se puede
hacer en otros tutoriales asociados.

Creamos en la base de datos test la tabla sesiones con
los campos id, x e y

Modificamos un poco el código (no se os olvide incluir en el
classpath el driver de jdbc para mysql  podéis ver otro tutorial  JDBCy MySql)

/*
 * ejemploGraficasServlet.java
 *
 * Created on 10 de agosto de 2003, 14:25
 */

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;

import java.sql.*;

/**
 *
 * @author  Roberto Canales
 * @version
 */
public class ejemploGraficasServlet extends HttpServlet
{

    public JFreeChart crearChart()
    {
        // este código no es optimo ..... hay que usar pools
        try
        {
            Driver d = (Driver)Class.forName("com.mysql.jdbc.Driver").newInstance();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }

        // GET CONNECTION
        Connection con = null;

        try
        {
            con = DriverManager.getConnection("jdbc:mysql://localhost/test","","");
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        JDBCXYDataset xyDataset = new JDBCXYDataset(con,"select x as meses,y as sesiones from sesiones");
        
        JFreeChart chart = ChartFactory.createLineXYChart("Sesiones en Adictos al Trabajo",
        "Meses",
        "Sesiones",
        xyDataset,
        PlotOrientation.VERTICAL,
        true,
        true,
        true                // Show legend
        );

        try
        {
            con.close();
        }
        catch(Exception e)
        {
            System.out.println("Error al desconectar " + e);
        }
        return chart;
    }


    int getParamEntero(HttpServletRequest request,String pNombre, int pDefecto)
    {
            String param = request.getParameter(pNombre);

            if (param == null || param.compareTo("") == 0)
            {
                return pDefecto;
            }

            return Integer.parseInt(param);

    }


    /** Processes requests for both HTTP GET and POST methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("image/jpeg");

        OutputStream salida = response.getOutputStream();
        JFreeChart grafica = crearChart();

        int ancho = getParamEntero(request,"ancho",400);
        int alto = getParamEntero(request,"alto",300);

        ChartUtilities.writeChartAsJPEG(salida,grafica,ancho,alto);

        salida.close();
    }

    /** Handles the HTTP GET method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

}

    

Y vemos como todo nos funciona bien ..

Ahora … todo es cuestion de estudiarse la ayuda (o comprar la
documentación) e ir adaptando el ejemplo a nuestras necesidades ….

Sobre el
Autor ..

4 COMENTARIOS

  1. Buenas, como podria hacer que se genere el eje x comprendido en un dia desde las 00:00 hasta las 24:00, y que el TimeSeries vaya cargando.
    Es decir que carge un dia completo en el eje x y luego vaya graficando hasta ocupar todo el area.

    Cordiales Saludos.

  2. HOLA
    SOY NUEVO EN ESTO
    ME INTERESO MUCHO LA APLICACION
    EXPLICADA EN ESTE TUTORIAL

    PERO HAY COSAS KE AUN NO ENTIENDO
    ME PREGUNTABA SI ALGUIEN ME PODRIA AYUDAR

    SALUDOS

  3. Buenas tardes, ¿como puedo hacer para al hacer clic sobre una barra de un grafico de barras, me acciones algun evento inherente a los valores de este? Gracias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad