jFreeChart

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

[code]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 );

}

}[/code]


Olá Amigos,

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

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

    renderer.setPositiveItemLabelPosition(p);
    
    renderer.setItemLabelAnchorOffset( 5f );[/code]

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