JavaFX 中的双面条形图

Double sided bar chart in JavaFX

对于我正在进行的项目,我想在 JavaFX 中将数据显示为不断更新的双面条形图(或双面直方图)。我已经成功创建了一个水平条形图,其中条形图仅从轴的一侧延伸,而不是从两侧延伸。

我想做的一个例子是,在图表上,每一行(或条形)代表一家商店,左侧代表当前女性的百分比,右侧代表当前男性的百分比。当顾客进出商店时,此图表会更新以显示当前的性别百分比,除非没有顾客,否则总加起来为 100%。在这种情况下没有酒吧。这意味着,除非没有顾客,否则酒吧的长度将始终相同,只是向两侧移动。整个图表可能显示 5 家不同的商店,因此有五个不同的性别代表条。

我没有足够的声誉来 post 图片所以这是 link 我想要的样子。

这是一个 link 看起来像我目前可以制作的东西。

谢谢!

最初我尝试使用 BarChart 对象来绘制双面条形图,但在查看 this question 之后我意识到 StackedBarChart 具有我正在寻找的东西。这是我用来为想知道如何执行此操作的其他人创建双面 histogram/bar 图表的代码:

    import java.util.Arrays;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.scene.Scene;
    import javafx.scene.chart.CategoryAxis;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.StackedBarChart;
    import javafx.scene.chart.XYChart;
    import javafx.stage.Stage;

    public class HorizontalHistogramTest extends Application{


        final static String austria = "Austria";
        final static String brazil = "Brazil";
        final static String france = "France";
        final static String italy = "Italy";
        final static String usa = "USA";
        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis();
        final StackedBarChart<Number, String> sbc =
        new StackedBarChart<Number,String>(yAxis, xAxis);
        final XYChart.Series<Number,String> series1 =
        new XYChart.Series<Number,String>();

@Override
public void start(Stage stage) {
    stage.setTitle("Bar Chart Sample");
    sbc.setTitle("Country Summary");
    xAxis.setLabel("Country");
    xAxis.setCategories(FXCollections.<String>observableArrayList(
            Arrays.asList(austria, brazil, france, italy, usa)));
    yAxis.setLabel("Percent");
    // plus value
    series1.getData().add(new XYChart.Data<Number,String>(10, austria));
    series1.getData().add(new XYChart.Data<Number,String>(50, brazil));
    series1.getData().add(new XYChart.Data<Number,String>(40, france));
    series1.getData().add(new XYChart.Data<Number,String>(50, italy));
    series1.getData().add(new XYChart.Data<Number,String>(60, usa));
    // minus value
    series1.getData().add(new XYChart.Data<Number,String>(-90, austria));
    series1.getData().add(new XYChart.Data<Number,String>(-50, brazil));
    series1.getData().add(new XYChart.Data<Number,String>(-60, france));
    series1.getData().add(new XYChart.Data<Number,String>(-50, italy));
    series1.getData().add(new XYChart.Data<Number,String>(-40, usa));

    Scene scene = new Scene(sbc, 800, 600);
    sbc.getData().addAll(series1);
    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    launch(args);
}
}