JFreeChart | Cómo agregar porcentaje al principio de cada eje de dominio de barras y formato (eje X) ticklabels?

Amila Iddamalgoda:

Estoy usando JFreeChart y que sigue es una captura de pantalla de la gráfica desarrollada por mí y el código relacionado.

JFreeChart

    private void getBarChart(List<Data> data) {
JFreeChart barChart = ChartFactory.createBarChart("", "", "", createDataset(data), PlotOrientation.VERTICAL, false, true, false);
        CategoryPlot plot = barChart.getCategoryPlot();
        plot.getRenderer().setSeriesPaint(0, new Color(7, 43, 97));

        barChart.getCategoryPlot().getRangeAxis().setLowerBound(0);
        barChart.getCategoryPlot().getRangeAxis().setUpperBound(1);
        NumberAxis xAxis2 = (NumberAxis) barChart.getCategoryPlot().getRangeAxis();
        xAxis2.setNumberFormatOverride(NumberFormat.getPercentInstance());

        plot.getRenderer().setSeriesItemLabelGenerator(0, new StandardCategoryItemLabelGenerator());
        plot.getRenderer().setSeriesItemLabelsVisible(1, true);
        plot.getRenderer().setBaseItemLabelsVisible(true);
        plot.getRenderer().setBaseSeriesVisible(true);
        barChart.getCategoryPlot().setRenderer(plot.getRenderer());


        BarRenderer.setDefaultBarPainter(new StandardBarPainter());
        ((BarRenderer) plot.getRenderer()).setBarPainter(new StandardBarPainter());

        BufferedImage image = new BufferedImage(650, 250, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(JFreeChart.KEY_SUPPRESS_SHADOW_GENERATION, true);
        Rectangle r = new Rectangle(0, 0, 650, 250);
        barChart.draw(g2, r);
        BufferedImage chartImage = barChart.createBufferedImage(600, 400, null);
}

El gráfico esperado debería ser algo como siguiente. introducir descripción de la imagen aquí

Pregunta 1.) ¿Cómo dar formato al eje x lables de acuerdo a la gráfica esperada? (CategoryLables o TickLabels en barChart.getCategoryPlot (). GetDomainAxis ())

Pregunta 2.) Los valores que aparecen en la parte superior de cada barra (SeriesItemLabels) necesita ser formateado con un signo de porcentaje (%) similar al eje y. (También creo que, al igual que lo he hecho en xAxis2.setNumberFormatOverride, los valores se consiguen automáticamente multiplicada por 100%. En este momento se muestra el valor decimal solamente). ¿Cómo lograr esto?

Por favor, ayúdame. Gracias.

Topaco:

1) La siguiente línea permite a los ejes-etiquetas con una inclinación ascendente:

CategoryAxis domainAxis = plot.getDomainAxis();  
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

45 indica el ángulo en grados y UP significa una orientación de abajo a la izquierda a arriba a la derecha. También se puede definir un ángulo arbitrario (por ejemplo, 22,5 °) con

CategoryAxis domainAxis = plot.getDomainAxis();  
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.toRadians(22.5))); 

Cabe señalar que createUpRotationLabelPositionsespera un ángulo en radianes.

2) La siguiente línea formatea las barras etiquetas de serie 0 en porcentaje.

DecimalFormat labelFormat = new DecimalFormat("##0.0 %");
labelFormat.setMultiplier(100);
plot.getRenderer().setSeriesItemLabelGenerator(0, new StandardCategoryItemLabelGenerator("{2}", labelFormat));
plot.getRenderer().setSeriesItemLabelsVisible(0, true);

con {0} = serie, {1} = categoría, {2} = valor

Como alternativa, se puede definir su propio generador de etiquetas, por ejemplo:

class CstmStandardCategoryItemLabelGenerator extends StandardCategoryItemLabelGenerator {

    @Override
    public String generateLabel(CategoryDataset dataset, int row, int column) {
        return String.format("%.1f %%", dataset.getValue(row, column).doubleValue() * 100.0);
    }
}

que simplemente se puede utilizar como sigue:

plot.getRenderer().setSeriesItemLabelGenerator(0, new CstmStandardCategoryItemLabelGenerator());

Esto resulta en:

introducir descripción de la imagen aquí

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=119887&siteId=1
Recomendado
Clasificación