Estás en:

informaciónDESARROLLADO POR:
icono_twiter icono_linkedin icono_linkedin icono_xing

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007. Twitter: @rcanalesmora

Autor del Libro: Informática profesional, las reglas no escritas para triunfar en la empresa

Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí

Fecha de publicación del tutorial: 2003-08-10
Tutorial visitado 83.353 veces83.353
Descargar el tutorial en PDF


Regístrate para votar
Share |

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  JDBC y 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 ..

Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Comentarios

  1. 2010-07-20 - 21:05:41
    Arturo_Pz

    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

  2. 2010-04-21 - 23:26:26
    FerJ

    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.

  1. Gonzalo Oviedo
    2009-08-11 - 06:32:59 PM

    No hay ningun ejemplo en toda la red Google que me explique como hacer 2 graficos de barra combinado con uno de lineas en JFreeChart. DAAAAAMN!

  2. Juan David Cardona
    2009-08-10 - 04:49:15 PM

    Cordial saludo Existe una forma impedir que el grafico cree valoeres intermedios? ejm Se genera un grafico con valores en eje x 1,2,3,4,5 la grafica muestra datos en el eje x 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Existe solucion para esto? muchas gracias

  3. gonzalo
    2009-07-17 - 07:50:27 PM

    HOLA, tal vez ya halla sido comentado o quizá se me paso al leer : en el primer ejemplo encontré errores, no encuentra clase o no encuentra método. no es nada grave... quizá halla cambiado el árbol de clases al salir nuevas versiones de la librería. yo estoy usando la que es la última versión en este momento es la 1.0.13 de jfreechart y la 1.0.16 de jcommon ... a su consideración... gracias por el tutorial.

  4. jorge
    2009-07-03 - 01:41:41 AM

    Buenas, tengo un problema cada vez que genero una imagen para la grafica, con el método ChartUtilities.writeChartAsJPEG(jfreechart, chartActual, ancho, alto,info); , ya que la imagen que me genera es una imagen gris con un simbolo de '?' de fondo. Tengo la version de jfreechart-1.0.1 y del jcommon-1.0.0, tambien e probado con las versiones jfreechart-1.0.1.3 y del jcommon-1.0.16, tengo la ersion del java 1.5 y la del tomcat la 6.0 ¿Alguien sabe a que se debe este error? Gracias por adelantado Saludos

  5. Alex
    2009-06-18 - 11:28:28 PM

    Buneas, tengo un sensor de la familia 1-Wire que me entrega datos de temperatura, la idea es con esos datos generar una garfica en tiempo real( se actualice cada segundo)con los datos que me entrega el sensor. gracias

  6. Danny
    2009-05-13 - 08:46:20 PM

    Como hago los mismos graficos utilizando Netbeans y las librerias Icefaces, en un jsp. Loq uqe quiero en un pequeño ejemplo utilizando OUTPUTCHART, sino me equivoco es igual al jfreechart pero de icefaces. ya tengo las librerias pero no se como hacer un ejemplo... para hacer una grafica cualquiera. Pero lo qu necesito es sacar datos de una base para poder graficar, al igual q este ejemplo con mysql.

  7. Jaime Carmona
    2009-04-24 - 12:20:06 PM

    Enohrabuena y gracias Roberto, sois una gran ayuda y buenos amigos de la gente curisosa de la informática. ¡Seguid así!

  8. RSANCHEZ
    2008-07-17 - 01:48:34 AM

    si tengo algun problema con el programa que se expone en este tutorial ustedes me pueden dar respuesta???????

  9. Diego Castaño
    2007-01-02 - 01:56:04 PM

    Realmente todos los tutoriales me parecen excelentes. No solo este. El material que se encuentra es muy bueno. Lo feo son las fotos de los muchachos, pero bueno. Son muy feos. !es una broma¡. La web es buena.

  10. Miguel Angel Ferral
    2006-11-22 - 09:40:51 PM

    Bastante bueno el tutorial, me sirvio mucho. Saludos

  11. Miguel Angel Lucas
    2006-11-07 - 10:28:51 AM

    Solo agradecer a la gente que comparte éste tipo de información, y de una manera tan lograda que haga que todo parezca trivial. Todos la información que he sacado de aqui no puedo decir sino que excelente. Muchas Gracias

  12. Antonio Pérez Santan
    2006-08-25 - 05:00:49 PM

    Bueno y directo al grano. Muestra como empezar con la libreria.

  13. jose honider
    2006-06-16 - 05:44:34 PM

    esta vacan....... yo estoy trabajando con la libreria grapichs, y sus funciones de ella (por medio de applet); pero necesito optener valores que estan almacenados en un base de datos mysql------- si me pudieras ayudar te lo agradeceria.......