如何在堆叠条形图中创建负值从上一个堆栈开始?

时间:2017-01-27 19:54:43

标签: javafx charts

我希望在堆积条形图中可视化每月的传入与传出金额,但差异应立即可见。

我正在使用以下示例代码:

public class Statistics extends Application {
    final CategoryAxis xAxis = new CategoryAxis();
    final NumberAxis yAxis = new NumberAxis();
    final StackedBarChart<String, Number> sbc = new StackedBarChart<>(xAxis, yAxis);
    final XYChart.Series<String, Number> incoming = new XYChart.Series<>();
    final XYChart.Series<String, Number> outgoing = new XYChart.Series<>();

    @Override
    public void start(Stage stage) {
        xAxis.setLabel("Month");
        xAxis.setCategories(FXCollections.observableArrayList(
                Arrays.asList("Jan", "Feb", "Mar")));
        yAxis.setLabel("Value");
        incoming.setName("Incoming");
        incoming.getData().add(new XYChart.Data("Jan", 25601.34));
        incoming.getData().add(new XYChart.Data("Feb2", 20148.82));
        incoming.getData().add(new XYChart.Data("Mar2", 10000));
        outgoing.setName("Outgoing");
        outgoing.getData().add(new XYChart.Data("Jan", -7401.85));
        outgoing.getData().add(new XYChart.Data("Feb2", -1941.19));
        outgoing.getData().add(new XYChart.Data("Mar2", -5263.37));
        Scene scene = new Scene(sbc, 800, 600);
        sbc.getData().addAll(incoming, outgoing);
        stage.setScene(scene);
        stage.show();
    }
}

结果是:

Stacked bar chart with negative values below zero

正如您所看到的,负传出值显示在零以下,而不是从正传入值中减去,这使得很难看到2。

我想要的是,负值的条形从条形顶部开始为正值,但是当它们重叠时,也会沿x轴应用偏移。在“Jan”系列的例子中,这应该类似于:

enter image description here

我正在玩getNode().setTranslateX/Y(),但这似乎不是一个好的解决方案,因为翻译单位不是图表中的标记,而是其他内容。

如何以优雅的方式创建第二张图像中的“堆叠”条形图?

1 个答案:

答案 0 :(得分:4)

你的问题很酷!

所以,在这里,我想使用 BarChart 而不是 StackedBarChart 来分享我的解决方案。它可能有点hacky,但它是唯一适合我的。

我想到的第一件事就是只需简单地取出条形并更改其Y坐标,但遗憾的是我们无法直接访问条形图。因此,在深入了解BCM956440的源代码之后,我发现所有图表的内容都位于XYChart,但获取者的内容为Group plotContent。在这种情况下,要做的事情之一是扩展类并增加方法的范围。所以(最后),代码来了:

protected

结果: The result