jFreeChart

1 resposta
Zenas

Olá Amigos,

Estou com uma dúvida para criar um Grafico Utilizando o jFreeChart, eu quero que as cores de fundo do gráfico sejam apresentadas a partir das faixas de valores do eixo x, no caso de Jan à Dez e a outra dúvida é, que os textos da linha do gráfico sejam afastados. A imagem do gráfico e código seguem abaixo:

Agradeço a todos que puderem me ajudar.

Abraços

package br.com.avanti.grafico;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.plot.PlotOrientation;
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.Layer;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

public class LineChartDemo1 extends ApplicationFrame {

	public LineChartDemo1(String title) {
		super(title);
		// TODO Auto-generated constructor stub
		final CategoryDataset dataset = createDataSet();
		final JFreeChart chart        = createChart(dataset); 
		final ChartPanel chartPanel   = new ChartPanel( chart );
		chartPanel.setPreferredSize( new Dimension( 800, 300 ) );
		setContentPane( chartPanel );
		
	}

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * @param args
	 */
	
	private CategoryDataset createDataSet(){
		
		// row keys
		final String series1 = "Indicador Anual";
		
		// column keys...
		final String janeiro = "Jan";
		final String fevereiro = "Fev";
		final String marco = "Mar";
		final String abril = "Abr";
		final String maio = "Mai";
		final String junho = "Jun";
		final String julho = "Jul";
		final String agosto = "Ago";
		final String setembro = "Set";
		final String outubro = "Out";
		final String novembro = "Nov";
		final String dezembro = "Dez";
		
		final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		
		dataset.addValue( 3.31, series1, janeiro );
		dataset.addValue( 30.50, series1, fevereiro );
		dataset.addValue( 41.56, series1, marco);
		dataset.addValue( 67.96, series1, abril);
		dataset.addValue( 98.82, series1, maio);
		dataset.addValue( null, series1, junho);
		dataset.addValue( null, series1, julho);
		dataset.addValue( null, series1, agosto);
		dataset.addValue( null, series1, setembro);
		dataset.addValue( null, series1, outubro);
		dataset.addValue( null, series1, novembro);
		dataset.addValue( null, series1, dezembro);
		
		return dataset;
	}
	
	private JFreeChart createChart( final CategoryDataset dataset ){
		
		final JFreeChart chart = ChartFactory.createLineChart(
				"", 
				"", 
				"", 
				dataset, 
				PlotOrientation.VERTICAL, 
				true, 
				false, 
				true);
		
		
		// Definindo cor de fundo do gráfico
		chart.setBackgroundPaint( Color.white );
		
		// Pegando a plotagem do gráfico para modificar o gráfico
		final CategoryPlot plot = (CategoryPlot) chart.getPlot();
		plot.setBackgroundPaint( Color.white );
		
		CategoryAxis categoryaxis = plot.getDomainAxis();  
        // Define a orientação e o ângulo de impressão dos labels do eixo  
		categoryaxis.setAxisLineVisible(false);
		categoryaxis.setLabelPaint( Color.BLACK );
		
		categoryaxis.setLowerMargin( 0.001 );
		categoryaxis.setUpperMargin(0.001);
		
		// Definindo a escala do eixo y do gráfico
		NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
		// Definindo escala do gráfico e maior valor
		numberAxis.setTickUnit(new NumberTickUnit(20));
		numberAxis.setRange(0, 130);
		// fazer o eixo ficar próximo do menor valor
		numberAxis.setAutoRangeIncludesZero(false);
		numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		
			
		// Mudando a cor da linha do gráfico
		CategoryItemRenderer categoryitemrenderer = plot.getRenderer();
		categoryitemrenderer.setSeriesPaint(0, Color.decode("#000066"));
		
		// Mudando a espessura da linha do gráfico
		final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        renderer.setSeriesStroke( 0, 
        		new BasicStroke(0.7f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
        						0.0f, new float[] {1.0f, 1.0f}, 0.0f ));
        
        // Exibindo linha do gráfico
        renderer.setSeriesShapesVisible(0, true);
        
        // Exibindo os valores nas linhas do gráfico
        renderer.setSeriesItemLabelsVisible(0, true);
        StandardCategoryItemLabelGenerator labelGenerator = 
        	new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("#,##0.00##") );
        renderer.setSeriesItemLabelPaint(0, Color.decode("#000066"));
        renderer.setSeriesItemLabelFont(0, new Font( "SansSerif", Font.PLAIN, 10));
        renderer.setSeriesItemLabelGenerator(0, labelGenerator); 
        
        // Definindo as cores de fundo do gráfico conforme eixo y
        final IntervalMarker target = new IntervalMarker(0.0, 80.0);
//        target.setLabel("");
//        target.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
//        target.setLabelAnchor(RectangleAnchor.LEFT);
//        target.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target.setPaint( Color.decode( "#FFD2D2" ) );
        target.setOutlinePaint( Color.BLACK );
        target.setOutlineStroke( new BasicStroke(1.1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
												 0.0f, new float[] {1.0f, 1.0f}, 0.0f ) ) ;
        plot.addRangeMarker(target, Layer.BACKGROUND);
        
        final IntervalMarker target1 = new IntervalMarker(80.0, 90.0);
//        target1.setLabel("");
//        target1.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
//        target1.setLabelAnchor(RectangleAnchor.LEFT);
//        target1.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target1.setPaint( Color.decode( "#FFFFD2" ) );
        target1.setOutlinePaint( Color.BLACK );
        target1.setOutlineStroke( new BasicStroke(1.1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
 				 				 				  0.0f, new float[] {1.0f, 1.0f}, 0.0f ) ) ;
        plot.addRangeMarker(target1, Layer.BACKGROUND);

        final IntervalMarker target2 = new IntervalMarker(90.0, 120.0);
//        target2.setLabel("");
//        target2.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
//        target2.setLabelAnchor(RectangleAnchor.LEFT);
//        target2.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target2.setPaint( Color.decode( "#D2FFD2" ) );
        target2.setOutlinePaint( Color.BLACK );
        target2.setOutlineStroke( new BasicStroke(1.1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
 				 				 				  0.0f, new float[] {1.0f, 1.0f}, 0.0f ) ) ;
        plot.addRangeMarker(target2, Layer.BACKGROUND);

        final IntervalMarker target3 = new IntervalMarker(120.0, 240.0);
//        target3.setLabel("");
//        target3.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
//        target3.setLabelAnchor(RectangleAnchor.LEFT);
//        target3.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target3.setPaint( Color.decode( "#FFFFD2" ) );
        target3.setOutlinePaint( Color.BLACK );
        target3.setOutlineStroke( new BasicStroke(1.1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
 				 				 				  0.0f, new float[] {1.0f, 1.0f}, 0.0f ) ) ;

        plot.addRangeMarker(target3, Layer.BACKGROUND);
        
        
		return chart;
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final LineChartDemo1 demo = new LineChartDemo1( "Line Chart Demo" );
		demo.pack();
		RefineryUtilities.centerFrameOnScreen( demo );
		demo.setVisible( true );

	}

}

1 Resposta

Zenas

Olá Amigos,

A segunda parte da minha dúvida eu consegui resolver com o seguinte código

ItemLabelPosition p = new ItemLabelPosition(
                ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_RIGHT, TextAnchor.BOTTOM_CENTER, 0.0 );

        renderer.setPositiveItemLabelPosition(p);
        
        renderer.setItemLabelAnchorOffset( 5f );

Falta a primeira dúvida que está me tirando o sono que é, [eu quero que as cores de fundo do gráfico sejam apresentadas a partir das faixas de valores do eixo x]

Agradeço a todos que puderem me ajudar.

Abraços

Criado 18 de agosto de 2011
Ultima resposta 18 de ago. de 2011
Respostas 1
Participantes 1