JFreeChart |Как добавить процент в верхней части каждого столбца и отформатировать метки доменных осей (ось X)? - PullRequest
0 голосов
/ 28 декабря 2018

Я использую JFreeChart и ниже приведен скриншот разработанной мной диаграммы и соответствующего кода.

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);
}

Ожидаемый график должен быть примерно таким.enter image description here

Вопрос 1.) Как отформатировать метки оси x в соответствии с ожидаемым графиком? (CategoryLables или TickLabels вbarChart.getCategoryPlot (). getDomainAxis ())

Вопрос 2)ось у.(Также я думаю, что, как я сделал в xAxis2.setNumberFormatOverride, значения будут автоматически умножаться на 100%. Сейчас он отображает только десятичное значение).Как этого добиться?

Пожалуйста, помогите мне.Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Начиная с BarChartDemo1.java, обновлено для JFreechart 1.5 , ниже показаны следующие альтернативы.

  1. Как показано здесь и здесь , вы можете вызвать setCategoryLabelPositions() на оси домена и использовать CategoryLabelPositions.createUpRotationLabelPositions для точной настройки угла.В приведенном ниже примере вращается против часовой стрелки на π / 4 радиана или 45 °.

    CategoryAxis domainAxis = plot.getDomainAxis();
    domainAxis.setCategoryLabelPositions(
        CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 4.0));
    
  2. A, показанный здесь , вы можете создать пользовательский StandardCategoryItemLabelGenerator, ноВы можете использовать ArgumentIndex {3}, который представляет собой значение в процентах от общей суммы столбца, а также подходящий NumberFormat.

    renderer.setDefaultItemLabelGenerator(
        new StandardCategoryItemLabelGenerator(
            "{3}", NumberFormat.getPercentInstance()));
    renderer.setDefaultItemLabelsVisible(true);
    

bar chart

0 голосов
/ 29 декабря 2018

1) Следующая строка включает метки осей с восходящим уклоном:

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

45 обозначает угол в градусах, а ВВЕРХ означает ориентацию снизу слева вверху справа.Вы также можете определить произвольный угол (например, 22,5 °) с помощью

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

. Следует отметить, что createUpRotationLabelPositions ожидает угол в радианах.

2) Следующая строка форматирует полосуметки серии 0 в процентах.

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

с {0} = серией, {1} = категорией, {2} = значением

В качестве альтернативы вы можете определить свой собственный генератор меток, например:

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);
    }
}

, который просто можно использовать следующим образом:

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

В результате:

enter image description here

...