JFreeChart: метки оси X гистограммы, перекрывающиеся с большими наборами данных - PullRequest
1 голос
/ 08 ноября 2019

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

Гистограмма, созданная с перекрывающимися метками оси X. Я попытался расположить этикетки вертикально, но все равно ничего не помогло. Пожалуйста, предоставьте наилучший способ решить эту проблему. Код приведен ниже:

CategoryDataset categoryDataSet = getBarDataset();
JFreeChart barChart = ChartFactory.createBarChart("TITLE", "X-LABEL","Y-LABEL", categoryDataSet, PlotOrientation.VERTICAL, true, true, false);
barChart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_90);
barChart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelLines(4);
jpg = Image.getInstance(im, null);
document.add(jpg);

Обновление: Согласно совету @trashgod, я использовал индексирование SlidingCategoryDataset от 0 до количества столбцов. Когда количество столбцов велико (здесь 50), X-метки перекрываются. Когда для столбца установлено меньшее значение, он работает нормально. Я хочу найти решение для большого размера столбца. Важно отметить, что мне нужно экспортировать изображение диаграммы в PDF. Пожалуйста, помогите мне прийти к возможному решению. Спасибо!

    private static void createBarChart() throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_LOCN));
        writer.setStrictImageSequence(true);
        document.open();
        CategoryDataset categoryDataset = createDataset();
        int colCount = categoryDataset.getColumnCount();
        SlidingCategoryDataset slidingCategoryDataSet = new SlidingCategoryDataset(categoryDataset, 0, colCount);
        JFreeChart barChart = ChartFactory.createBarChart("TITLE", "X-LABEL","Y-LABEL", slidingCategoryDataSet, 
                PlotOrientation.VERTICAL, true, true, false);
        barChart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_90);
        barChart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelLines(4);
        java.awt.Image im = barChart.createBufferedImage(400, 400);
        Image jpg = Image.getInstance(im, null);
        jpg.scaleToFit(400, 400);
        document.add(jpg);
        document.close();
        writer.close();
    }

    private static CategoryDataset createDataset() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i <= 50; i++) {
            dataset.addValue(i, "R", "C" + i);
        }
        return dataset;
    }

enter image description here

1 Ответ

2 голосов
/ 12 ноября 2019

При большом количестве категорий указание вертикальных меток с помощью setCategoryLabelPositions() является хорошим выбором для обеспечения максимальной разборчивости. Поддерживаются произвольные значения CategoryLabelPositions.

На интерактивной диаграмме SlidingCategoryDataset, упомянутое здесь , позволяет вашему приложению установить счетчики начальный индекс видимых категорий по желанию, возможно, с помощью ползунка или счетчика, как показано здесь .

Как этого добиться в PDF? ... Больше пикселей кажется хорошимидея, но как мы можем реализовать это здесь?

В контексте фиксированного размера с заданным количеством категорий, вы можете оптимизировать размер изображения диаграммы с помощью createBufferedImage(), как показано здесь или Image.scaleToFit(). Для еще больших наборов данных может быть возможно создать несколько связанных диаграмм в домене, например, по году или дочерней компании.

...