Geração de gráfico de área

0 respostas
mcsous

Pessoal,

Tenho que criar um gráfico de área combinado com linhas. A idéia básica é a seguinte. Tenho um crédito inicial para todos os meses e os dados do gráfico de área podem ser incompletos de acordo com a data que ele foi gerado. Exemplo: Estamos em novembro e as atividades financeiras de 2009 estão fechadas até outubro, portanto não tenho dados de Novembro e dezembro. O gráfico ideal é semelhante a imagem abaixo:

[img]http://www.marcossousa.com/arquivos/chart_right.png[/img]

Porém, usando JFreechart estou tendo problemas em encerrar esta área em 90° como no exemplo acima. Usei 3 tentativas:
1ª - O dataset para áreas possui dados de janeiro a dezembro onde ao terminar os valores, os demais são zerados.
2ª - O dataset para áreas possui dados de janeiro a dezembro onde ao terminar os valores, os demais recebem o valor NULL.
3ª - O dataset para áreas possui dados de janeiro a até o mês que há dados.

Para o primeiro caso a área encerra até o próximo mês. O Segundo caso, a área encerra entre o último mês e seu subseqüente, como na imagem abaixo. Já para o terceiro a área inicia e encerra corretamente, porém a área é centralizada na área de plotagem e é gerado fora da perspectiva.

[img]http://www.marcossousa.com/arquivos/chart_wrong.png[/img]

Abaixo, há um código de teste gerando o gráfico usando a idéia 3.
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.CombinedDomainCategoryPlot;
import org.jfree.chart.renderer.AbstractRenderer;
import org.jfree.chart.renderer.AreaRendererEndType;
import org.jfree.chart.renderer.category.AreaRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.Log;
import org.jfree.util.PrintStreamLogTarget;

public class AreaChartDemo extends ApplicationFrame{

    public static void main(final String[] args){

        Log.getInstance().addTarget(new PrintStreamLogTarget());
        final AreaChartDemo demo = new AreaChartDemo("Area Chart Demo");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }

    public AreaChartDemo(final String title){

        super(title);

        // create the chart...
        final JFreeChart chart = createChart();
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        chartPanel.setEnforceFileExtensions(false);

        setContentPane(chartPanel);

    }

    private void configureChart(JFreeChart chart){
        CategoryPlot p = chart.getCategoryPlot();
        p.setForegroundAlpha(0.85f);
        p.setRangeGridlinePaint(Color.red);
        p.setDomainGridlinesVisible(true);
        p.setDomainGridlinePaint(Color.black);
        p.setBackgroundPaint(Color.WHITE);

        final CategoryAxis domainAxis = p.getDomainAxis();
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
        domainAxis.setLabelFont(new Font("SansSerif", Font.BOLD, 10));
        domainAxis.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 10));
        domainAxis.setLowerMargin(-0.045);
        domainAxis.setUpperMargin(-0.045);
        domainAxis.setCategoryMargin(0.0);
    }

    private JFreeChart createChart(){

        final ValueAxis valueAxis = new NumberAxis("Milion");

        final CategoryDataset areaDataSet = generateAreaDataSet();
        final CategoryDataset lineDataSet = generateLineDataSet();

        valueAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        final AreaRenderer areaRenderer = new AreaRenderer();
        areaRenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
        areaRenderer.setSeriesPaint(0, Color.GRAY);
        areaRenderer.setSeriesPaint(1, Color.YELLOW);
        areaRenderer.setSeriesPaint(2, Color.GREEN);
        areaRenderer.setSeriesPaint(3, Color.BLACK);
        areaRenderer.setEndType(AreaRendererEndType.TRUNCATE);

        final CategoryPlot subPlot = new CategoryPlot(lineDataSet, null, valueAxis, areaRenderer);

        subPlot.setDataset(1, areaDataSet);
        final CategoryItemRenderer lineRenderer = new LineAndShapeRenderer();
        lineRenderer.setSeriesPaint(0, Color.BLUE);
        lineRenderer.setBaseShape(AbstractRenderer.DEFAULT_SHAPE);

        lineRenderer.setSeriesStroke(0, new BasicStroke(7.0f));

        subPlot.setForegroundAlpha(0.9f);
        subPlot.setRenderer(1, areaRenderer);
        subPlot.setRenderer(0, lineRenderer);

        // domainAxis se refere ao eixo x
        final CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot();
        plot.add(subPlot, 1);

        final JFreeChart chart = new JFreeChart("Financial analise", new Font("SansSerif",
                Font.BOLD, 12), plot, true);
        chart.setBackgroundPaint(Color.WHITE);

        configureChart(chart);

        return chart;
    }

    private DefaultCategoryDataset generateAreaDataSet(){
        String[] months = { "Jan", "Feb", "Mar"};
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < months.length; i++){
            dataset.addValue(60 * i, "Credit", months[i] + "/2009");
            dataset.addValue(50 * i, "Added Budged", months[i] + "/2009");
            dataset.addValue(30 * i, "Compromissed", months[i] + "/2009");
            dataset.addValue(15 * i, "Spents", months[i] + "/2009");
        }

        return dataset;
    }

    private DefaultCategoryDataset generateLineDataSet(){
        String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Ago", "Sep", "Oct",
                "Nov", "Dec" };
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < 12; i++){
            dataset.addValue(300, "Initial Budged", months[i] + "/2009");
        }
        return dataset;
    }

}

Existe algo que pode ser feito usando JFreeChart? Ou alguém conhece outra ferramenta capaz de gerar o resultado pretendido?

Criado 18 de novembro de 2009
Respostas 0
Participantes 1