[Resolvido] iReport Bar Chart - Girar o Label que fica acima das barras (eixo X)

Boa tarde!

Tenho um gráfico de barras no ireport, que exibe os valores tanto acima, quanto abaixo de cada barra.
Porém quando eu solicito a exibição de muitos valores, que resultam em muitas barras, alguns valores de barras que estão em alturas próximas, se sobrepoem.

Para isso, pensei em girar esses labels em 45º em meu chart customizer, mas não achei nada na internet pra esse label em específico, apenas para o label principal:

final CategoryPlot plot = chart.getCategoryPlot(); final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setVerticalTickLabels(true); // Não serve!!

Alguém consegue me dar uma luz de como fazer isso?
Minha classe customizer
obs: desculpe se minha alteração de cores for gambiarra, hoje mesmo eu tava procurando forma melhor de implementar isso :frowning:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Graficos;

import java.awt.Color;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;

/**
*

  • @author bruno
    /
    public class PrevisaoBarrasCustomizer implements JRChartCustomizer{
    /
    Converte uma cor RGB em HSB e armazena em um vetor float[3] */
    float[] hsbBar1 = Color.RGBtoHSB(153, 0, 0, null); // Vermelho escuro
    float[] hsbBar2 = Color.RGBtoHSB(102, 153, 255, null); // Azul claro fosco

    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {
    /* Obtem o renderer do gráfico de barras */
    BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();

     /* Define as cores das barras 0 e 1 */
     renderer.setSeriesPaint(0, Color.getHSBColor(hsbBar1[0], hsbBar1[1], hsbBar1[2]));
     renderer.setSeriesPaint(1, Color.getHSBColor(hsbBar2[0], hsbBar2[1], hsbBar2[2]));
     
     /* 
      * Altera a margem superior e inferior para 15% (0.15), fazendo com que
      * os labels não sejam cortados como na configuração padrão
      */
     final CategoryPlot plot = chart.getCategoryPlot();
     final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();      
     rangeAxis.setUpperMargin(0.15);
     rangeAxis.setLowerMargin(0.15);
    

    }
    }[/code]

Já to fazendo ele girar, porém a única propriedade que consigo mexer legal é o angulo, os outros objetos não sei do que se tratam, mas vou continuar tentando;

CategoryItemRenderer line = plot.getRenderer(); ItemLabelPosition ilp = line.getBasePositiveItemLabelPosition(); ilp = new ItemLabelPosition(ilp.getItemLabelAnchor(), ilp.getTextAnchor(), ilp.getRotationAnchor(), 25); // (LabelAnchor, TextAnchor, RotationAnchor, ângulo: double line.setBasePositiveItemLabelPosition(ilp);

Depois de um tempinho voltei a mexer nesse gráfico, e cheguei a solução. A parte do código que rotaciona o label que fica em cima da barra, está abaixo. Notem que precisei mexer tanto na rotação do label para valores positivos quanto para negativos. Espero que ajude alguem no futuro :slight_smile:

[code]/* Rotaciona os labels de cada barra do eixo X /
/
Obtem o plot renderer */
CategoryItemRenderer line = plot.getRenderer();

    /* Armazena o label position dos valores positivos */
    ItemLabelPosition ilpPositive = line.getBasePositiveItemLabelPosition();
    
    /* 
     * Instancia novo objeto e armazena sua referencia na variavel 
     * ilpPositive.
     */
    ilpPositive = new ItemLabelPosition(ilpPositive.getItemLabelAnchor(), 
                                        TextAnchor.BASELINE_LEFT, // O ponto do label que será ancorado
                                        TextAnchor.BASELINE_LEFT, // O ponto em que o label será rotacionado
                                        -0.872638); // Rotação de 50 graus do label em radianos
    line.setBasePositiveItemLabelPosition(ilpPositive);
    
    /* 
     * Armazena o label position dos valores negativos, basicamente o mesmo 
     * processo do label positivo 
     */
    ItemLabelPosition ilpNegative = line.getBaseNegativeItemLabelPosition();
    
    ilpNegative = new ItemLabelPosition(ilpNegative.getItemLabelAnchor(), 
                                        TextAnchor.BASELINE_LEFT, 
                                        TextAnchor.BASELINE_LEFT, 
                                        0.872638);
    line.setBaseNegativeItemLabelPosition(ilpNegative);[/code]