Как создать StackedBarChart с конкретными интервалами, пустым пространством и повторяющимися ключами строк в JFreeChart? - PullRequest
0 голосов
/ 21 января 2019

Я хочу создать StackedBarChart, который представляет элементы в пределах определенной длины.Конечный результат должен выглядеть примерно так:

https://i.imgur.com/LOJn1Si.png

У меня есть данные для каждой строки (строка 1 -> A от 0,5 до 3 и Bот 4,5 до 7, например).

Проиграв некоторое время и не найдя прямого способа сделать это, в качестве обходного пути я попытался использовать CategoryDataset со StackedBarRenderer и «конвертировать» мои данныев формат и просто нарисуйте пустое так же, как фон.

Это уже проблема, так как он пытается добавить обе «пустые» записи и просто отобразить их как одну в середине.Затем я просто сделал каждую «пустую» запись уникальной, и она работала нормально.Проблема идет со следующей записью «A» в строке «3», где она каким-то образом переключает порядок, в котором я помещаю данные в набор данных, и отображает «A» перед «B» (я предполагаю, чтобы выровнять его с A впервая строка).

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

https://i.imgur.com/RLu1xqx.png

Я действительно не знаю, что еще попробовать прямо сейчас.У меня такое чувство, что я что-то пропустил, и есть очень простой способ добиться этого - есть ли способ сделать это с JFreeChart или я должен использовать другую библиотеку?

Набор данных:

private CategoryDataset createDataset() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        //testdata
        dataset.addValue((Number) 0.5, "empty", 1);
        dataset.addValue((Number) 2.5, "A", 1);
        dataset.addValue((Number) 1.5, "empty2", 1);
        dataset.addValue((Number) 2.5, "B", 1);

        dataset.addValue((Number) 1.5, "empty3", 2);
        dataset.addValue((Number) 2.5, "C", 2);
        dataset.addValue((Number) 2, "empty4", 2);
        dataset.addValue((Number) 3, "D", 2);

        dataset.addValue((Number) 1, "empty5", 3);
        dataset.addValue((Number) 2.5, "B", 3);
        dataset.addValue((Number) 1.5, "empty6", 3);
        dataset.addValue((Number) 3, "A", 3);
        return dataset;
}

Диаграмма:

        plot = new CategoryPlot();
        plot.setRangeAxisLocation(AxisLocation.TOP_OR_RIGHT);
        plot.setOrientation(PlotOrientation.HORIZONTAL);

        CategoryDataset dataset = createDataset();

        CategoryAxis catAxis = new CategoryAxis();
        NumberAxis numAxis = new NumberAxis();
        numAxis.setVerticalTickLabels(true);

        StackedBarRenderer rend = new StackedBarRenderer();

        for (int i = 0; i < dataset.getRowCount(); i++) {
            String currKey = (String) dataset.getRowKey(i);
            if (currKey.startsWith("empty")) {
                rend.setSeriesPaint(i, INVISIBLE);
                rend.setSeriesItemLabelFont(i, new Font("Verdana", Font.BOLD, 0));
            }
        }

        rend.setShadowVisible(false);
        rend.setBarPainter(new StandardBarPainter());
        rend.setMaximumBarWidth(HEIGHT);

        rend.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{0}", NumberFormat.getInstance()));
        rend.setBaseItemLabelsVisible(true);

        plot.setDataset(dataset);
        plot.setDomainAxis(catAxis);
        plot.setRangeAxis(numAxis);
        plot.setDomainGridlinesVisible(false);
        plot.setRangeGridlinesVisible(false);
        plot.setRenderer(rend);
        plot.setBackgroundPaint(INVISIBLE);

        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
        chart.getLegend().setVisible(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...