0 votos
por (440 puntos) en Java
Buenas a tod@s

Tengo que hacer una aplicación que me muestre unos valores en unas gráficas. He encontrado una libreria supero maja que te da todo el trabajo hecho y con unas pocas de líneas de código te metes lo valores en las gráficas. El jfreechart(que asi se llama) me esta dando un problemilla. Tengo la ventana con los datos correctamente, lo único que no soy capaz de que me alinee correctamente las nombres que pongo en las columnas con las barras.

ME explico un poco mas a fondo. La gráfica en el ejeY contiene los nombres de los dos mejores empleados de una empresa por cada uno de los meses, es decir:

Ene(Perez-Gomez)

Feb(Garcia-Martinez)

Mar(Garcia-Martinez) ....

En el eje X se refleja el volumen de ventas de cada empleado.

El problema esta que jfreechart cuando los meses tienen los mismos mejores empleados(caso de febrero y marzo) pues junta las barras pero los nombrs lo deja en el mismo sitio y claro...Esto genera un desajuste gráfico que hace difícil la comprensión.

¿Alguien sabe como decirle al jfreechart que haga el favor de estarse quietecito con las barras...jejeje?

Espero haberme explicado claramente.

Un saludo y muchas gracias de antemano.


15 Respuestas

0 votos
por (8.5k puntos)
Buenas!

Leído el xml pasamos a mostrar los datos? jeje

Yo he utilizado JFreeChart en varios proyectos, JFreeChart está bien pero hace tiempo que no la actualizan, es para mostrar en una aplicación web? porque hay muchas librerías de js con gráficas que son una pasada...

No entiendo bien como quieres mostrar la información:

Empleados

|

|

|

|

|___________________ Ventas

No tiene mas sentido al revés? la idea es una tabla resultante parecida a esta no?

http://www.jfree.org/jfreechart/images/DualAxisDemo1.png

Solo que con 2 barras en lugar de 3?


0 votos
por (440 puntos)
Jejejeje ojala solo fuera eso...xD

No es solo sacar los datos de alguna manera en una grafica, tengo libertad para hacerlo "mas o menos como quiera".Tengo que hacer mas cosillas y no me quiero complicar demasiado con esto. Me gusto la idea es bastante sencillo y codigo hay que picar bastante poco.

COn dos barras es suficiente. En el eje x se mostraria el volumen de ventas y en el ejey los meses(y ademas los dos mejores empleados de cada mes).

 Una solución a medio plazo que encontre es hacer distinta la entrada de cada uno de los valores del ejey es la siguiente. Utilizar algo que distinga las entradas entonces lo que hice fue en lugar de pones solo el nombre de los empleados es añadirle algo que indentifica al mes, es decir:

En->Garcia,Ramos

Fe->Garcia,Ramos

Con esto consegui que no me juntara las entradas iguales, en un pequeño avance aun así sigue habiendo un pequeño desajuste y en los primeros meses la barra salen quizas medio centrimetro por arriba del nombre y en los ultimos casi medio centimetro por debajo. TIene que haber alguna manera de decirle que pinte la barra a la altura del nombre...pero por mas que miro no la encuentro...

Por cierto la tabla resultante esa...Si me dices como se hace para inclinar los nombres de lo que tengo en el ejex quizas podria poner el nombre de los empleados y los meses en el ejex y las ventas en el ejey...(es decir al reves de como lo tengo hecho porque ahora lo tengo configurado asi...        JFreeChart chart = ChartFactory.createBarChart("Volumen de ventas","","Ventas",dataset,

        PlotOrientation.HORIZONTAL,...);

y la ventana mas alta que ancha...

PEro la mejor manera seria como tu dices...el tema es que asi como no se inclinar los nombres pues se me solapan y me queda hecho una autentica guarrada...xD. Por eso opte por la otra forma...jejeje

Muchas gracias por responder.

Un saludo


0 votos
por (8.5k puntos)
Buenas para las etiquetas,

        CategoryPlot plot = (CategoryPlot)chart.getPlot();
        CategoryAxis xAxis = (CategoryAxis)plot.getDomainAxis();
        xAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
0 votos
por (8.5k puntos)
Buenas again,

no se cuantos empleados pueden existir, pero de esta manera a mi me gusta como queda:


import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;

import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class EjemploGraficas {
    public static void main(String[] args) {

        // Creamos y rellenamos el modelo de datos
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.setValue(100, "empleado1", "Enero");
        dataset.setValue(120, "empleado3", "Febrero");
        dataset.setValue(110, "empleado2", "Marzo");
        dataset.setValue(103, "empleado5", "Abril");
        dataset.setValue(106, "empleado6", "Mayo");

        dataset.setValue(60, "empleado2", "Enero");
        dataset.setValue(62, "empleado4", "Febrero");
        dataset.setValue(61, "empleado4", "Marzo");
        dataset.setValue(63, "empleado3", "Abril");
        dataset.setValue(66, "empleado3", "Mayo");

        JFreeChart chart = ChartFactory.createBarChart3D("Ventas", "Mes",
                   "Número ventas", dataset, PlotOrientation.VERTICAL, true,
                   true, false);

        CategoryPlot plot = (CategoryPlot)chart.getPlot();
        CategoryAxis xAxis = (CategoryAxis)plot.getDomainAxis();
        xAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

        chart.setBackgroundPaint(ChartColor.WHITE);
        try {
            ChartUtilities.saveChartAsPNG(new File("chart.png"), chart, 400, 300);
         // Creación del panel con el gráfico
            ChartPanel panel = new ChartPanel(chart);

            JFrame ventana = new JFrame("El grafico");
            ventana.getContentPane().add(panel);
            ventana.pack();
            ventana.setVisible(true);
            ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

Un saludo


0 votos
por (440 puntos)
Buenas.

Lo que me ofreces queda muy vistoso si que es cierto.

Lo que pasa es que lo que necesito no es exactamente asi. Quizas no me explique bien.

Te voy a comentar la manera que necesito. Por cada mes una barra. Supon que solo hay meses y ventas, de modo que en el ejex irian enero,febrero,... y en el ejey las ventas en cada mes(pero las totales no separadas por empleados que es lo que me ofreces). Asociado a cada mes el nombre de los 2 empleados que mas ganaron en el mes,pero eso no es problema, de hecho ignóralo. Es decir en resuemn quiero tener en el eje x 12 meses y en el eje y las ventas asociadas a cada mes. Como los nombres del eje x seran muy largos me gustaria tenerlos inclinados. ¿Me podrias poner un ejemplo con lo que te dije con las barras en 3D que queda muy bien?

¿Para inclinarlos utilizas esto no?

        CategoryPlot plot = (CategoryPlot)chart.getPlot();
        CategoryAxis xAxis = (CategoryAxis)plot.getDomainAxis();
        xAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
¿y con la ultima linea supongo que le diras los grados que lo quieren inclinar no?

Muchas gracias por responder


0 votos
por (8.5k puntos)
Buenas again,

Sería lo mismo pero con una única entrada para cada mes en el data set, y en lugar de "empleado1", "empleado2", etc. pon "ventas".

Hay un tema de subCategorias que igual te sirve, aunque en tu caso la información de los empleados es independiente de lo que muestras en la gráfica, te puede servir.

http://www.roseindia.net/chartgraphs/stacked-bar-chart1.shtml


0 votos
por (440 puntos)
Buenas gracias por responder de nuevo.

Ya lo tengo solventado y todo como queria.

Ahora solo me queda una cosilla mas. Tengo que generar las mismas graficas en un documento html. Es decir desde java tengo que hacer un documento html con un par de graficas. Pero vamos como si fuera una porque cogida la idea para una hechas todas.

No creo que sean demasiadas lineas de código pero nunca lo hice...

Nunca he hecho esto, así que cualquier ayuda me viene muy bien.

Necesitaria un guia o manual desde 0...para poder tomar conceptos. ¿Alguna idea?¿Alguien le ha surgido este problema?¿Cómo debo de empezar?

Saludos y muchas gracias de antemano.


0 votos
por (8.5k puntos)
Si es solo un html para mostarlo, coge los .png que te genera el JFreeChart y muestralos.

chart.png en este caso


0 votos
por (440 puntos)
Buenas de nuevo.

Lo que propones es una buena idea, no se me habia pasado por la cabeza. Lo que pasa es que me piden que sea de la forma mas óptima(como siempre...xD). No digo que no sea la mas óptimo. Pero me gustaría ver cual es tu opinión. Pero vamos digo yo..¿que manera más optima que mostrar un dibujo en html en lugar de nadar pintandolo?

Lo que no gustaria es que me llamen cómodo o que de la impresión de que hago esto porque no se hacer lo otro...Si lo hago así tendría que dar un argumento de peso como que es la manera más óptima que se me ocurrió.

De todos modos la impresión que me da es no va quedar muy bien hacerlo así porque parece como que estoy escurriendo el bulto...Entonces sería mejor aunque sea más código hacerlo sin contar con las imagenes.

Saludos


0 votos
por (8.5k puntos)
Buenas,

Si ya tienes una aplicación Java que genera las gráficas lo mas óptimo es usar el gráfico generado.

Al principio te preguntaba si era una aplicación web porque tienes alternativas en javascript que generan gráficas y también el propio JFreeChart genera gráficas que se pueden mostrar a través de un servlet en una jsp por ejemplo.

http://www.geodaq.com/jfreechart-sample/index.html

http://www.geodaq.com/jfreechart-sample/bar_chart.jsp

Un saludo


Preguntas relacionadas

0 votos
1 respuesta
preguntado por Juakata (20 puntos) Ene 28, 2016 en Java
0 votos
0 respuestas
preguntado por srAlucard (20 puntos) Ene 28, 2016 en Java
0 votos
0 respuestas
preguntado por desatole (20 puntos) Ene 28, 2016 en Java
Bienvenido a Dudas de Programación, donde puedes hacer preguntas y recibir respuestas sobre los problemas más frecuentes de los lenguajes de programación, frameworks de desarrollo y bases de datos que utilices. Foro de Línea de Código

Categorías

...