[JFreeChart] Duvida a respeito do BarChart (grafico de barras)

Ola pessoal… estou utilizando a biblioteca JFreeChart e estou precisando criar um grafico de barras com legenda. O problema, eh que eu nao consigo alterar a cor de cada barra, apenas de todas ao mesmo tempo. Eh como se ele reconhecesse o dataset como sendo a mesma categoria e a legenda fica unica tambem.

Alguem jah teve o mesmo problema??? Ou nao fui claro? hehe

Abracos…

[quote] private void CreateBarChart(String[] campos, String[] valores,
String titulo, int orientacao, String x, String y,HashMap cores) {

    String Cores =(String) cores.get("Cores");
    String [] coresSplited = Cores.split(";");
    Color [] ObjetosCores = new Color[coresSplited.length];
    String corHexa = "";
    for(int i = 0; i < coresSplited.length; i++)
    {
      if (coresSplited[i].toString().indexOf("#")>-1)
      {
        corHexa = coresSplited[i].toString();
        ObjetosCores[i] = converteRGB(corHexa);
      } else {
        String corSplit1 = coresSplited[i].replace("RGB(","");
        corSplit1 = corSplit1.replace(")","");
        String[] corSplit3 = corSplit1.split(",");
        ObjetosCores[i] = new Color(Integer.parseInt(corSplit3[0]),Integer.parseInt(corSplit3[1]),Integer.parseInt(corSplit3[2]));
      }
    }
    
    int qntLinhas = 0;
    try {
        for (int i = 0; i < valores.length; i++) {
            dataset.addValue(Double.parseDouble(valores[i].replace(",",".")),"(" + valores[i].toString().replace(",",".") +")" + campos[i], Integer.toString(i+1) ); //Adiciona os valores no category para gerar as barras
            qntLinhas++;
        }

        //Gera o gráfico
        if (orientacao == 1) //Valida a Orientação   -- horizontal ou vertical
         {
            chart = ChartFactory.createBarChart(titulo, x, y, dataset,
                    PlotOrientation.HORIZONTAL, true, true, true); //Gera o gráfico de barra
        } else {
            chart = ChartFactory.createBarChart(titulo, x, y, dataset,
                    PlotOrientation.VERTICAL, true, true, true);              
        }

        CategoryPlot plot = chart.getCategoryPlot(); //Pega o plot para pintar as barras
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(true); //Desenha a linha externa nas barras (bordas das barras)
        for (int i = 0; i <= qntLinhas; i++) 
        {
          renderer.setSeriesPaint(i,
              new GradientPaint(0.0f, 0.0f,ObjetosCores[i], 0.0f, 0.0f,
                  Color.lightGray)); //Pinta no degradê q eu quero.
        }
        
    } catch (Exception e) {
      System.out.println("Erro: " + e.getMessage());
    }

}

qualquer duvida me fala que eu te ajudo

Explicando o codigo, eu chamo esse metodo passando todos os parametros necessarios para sua construção mais um hashmap de cores, como recupero as cores de acordo com oq o usuario escolhe em tempo de execução, o codigo espera tanto uma cor rgb como hexadecimal.

Depois de definir o dataset crio esse CategoryPlot, que me serve exatamente para personalizar as barras, de acordo com o numero de barras que eu tenho, a quantidade de cores para cada uma tem que ser a mesma…eu pinto as barras com estilo degrade…
Se o pessoal do forum quiser posso elaborar um tutorial sobre JFreeChart, estudei essa biblioteca pra faze graficos Bar, Meter, Polar e Pizza

Gostaria de saber se vc sabe como faço pra colocar números (legenda) em cima das barras.
Já tentei utilizando a classe DefaultStatisticalCategoryDataset mas ainda não consegui.

Se alguém puder ajudar agradeço.

Maurício Pettinate.

têm essas duas formas:

renderer.setSeriesItemLabelsVisible(0, Boolean.TRUE);
renderer.setItemLabelsVisible(true);

a segunda é um método depreciado.

Obrigado Fernando, mas mesmo assim ainda não funcionou… :frowning:

Veja como está meu método:

public void mudaCorBarra(JFreeChart chart) {

	CategoryPlot plot = (CategoryPlot) chart.getPlot();
	BarRenderer rend = (BarRenderer) plot.getRenderer();
	rend.setSeriesPaint(0, (Paint) Constantes.CORES_GRAFICOS.get("azulAco")); // azul aço
	rend.setSeriesPaint(1, (Paint) Constantes.CORES_GRAFICOS.get("branco") ); // branco 
	rend.setSeriesPaint(2, (Paint) Constantes.CORES_GRAFICOS.get("cinzaGray") ); // cinza Gray
	rend.setSeriesItemLabelsVisible(0,Boolean.TRUE,true); 
	rend.setSeriesItemLabelsVisible(1,Boolean.TRUE,true);
	rend.setSeriesItemLabelsVisible(2,Boolean.TRUE,true);
	rend.setDrawBarOutline(true);
	
}

Estou fazendo alguma coisa errada?

abs!

Cara,
adiciona essa linha:

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

e vê se funfa aí…

aeeeeee, funcionooou!! Poxa Fernandão, muito obrigado mesmo pela ajuda cara!!
Um problema que vi que estava acontecendo também, é que eu estava trabalhando com a lib jfreechart-0.9.20.jar e
jcommon-0.9.5.jar… para funcionar, tive que atualizar as libs para a jfreechart-1.0.12.jar e jcommon-1.0.15.jar
Trabalhando com as libs antigas, o método fica:

CategoryPlot plot = chart.getCategoryPlot();
StackedBarRenderer renderer = new StackedBarRenderer();
renderer.setItemLabelsVisible(true);
renderer.setSeriesItemLabelsVisible(2,true);
//StandardCategoryLabelGenerator standardCategoryLabelGenerator = new StandardCategoryLabelGenerator(); essa nao funciona na lib antiga
renderer.setBaseLabelGenerator(new StandardCategoryLabelGenerator());
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
plot.setRenderer(renderer);

Depois que tiver deixado o gráfico funcionando perfeitamente aqui, posto para o pessoal que quiser utilizar como exemplo!

Grande abraço,

Maurício Pettinate.