1

我想创建一个表示一定长度内的元素的 StackedBarChart。Endresult 应如下所示:

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

我有每一行的数据(例如,第 1 行 -> A 从 0,5 - 3 和 B 从 4,5 到 7)。

在玩了一段时间并没有找到直接的方法来做到这一点之后,作为一种解决方法,我尝试使用具有 StackedBarRenderer 的 CategoryDataset 并将我的数据“转换”为格式,然后将空白绘制为与背景相同。

这已经是一个问题了,因为它随后会尝试添加两个“空”条目并将其显示为中间的一个。然后我简单地使每个“空”条目都是唯一的,这样就可以正常工作。问题出现在“3”行中的下一个“A”条目,它以某种方式切换了我将数据放入数据集中的顺序,并在“B”之前显示“A”(我猜它与 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);
4

0 回答 0