Двусторонняя гистограмма в JavaFX

Для проекта, над которым я работаю, я хотел бы отображать данные в виде постоянно обновляемой двусторонней гистограммы (или двусторонней гистограммы) в JavaFX. Я успешно создал горизонтальную гистограмму, на которой столбцы выходят только с одной стороны оси, но не с обеих сторон.

Примером того, что я хочу сделать, может быть, на диаграмме каждая строка (или полоса) представляет магазин, левая сторона представляет, какой процент в настоящее время принадлежит женщинам, а справа - процент мужчин в настоящее время. По мере того, как покупатели входят в магазин и выходят из него, эта диаграмма обновляется, показывая текущий процент пола, при этом он всегда составляет 100%, если нет покупателей. В этом случае бара нет. Это означает, что, если нет клиентов, полоса всегда будет одинаковой длины, только смещенная в каждую сторону. На всей диаграмме показано, возможно, 5 разных магазинов, поэтому есть пять разных столбцов с гендерными представлениями.

У меня недостаточно репутации, чтобы опубликовать изображение, поэтому вот ссылка на то, как я хочу, чтобы это выглядело.

Это ссылка это похоже на то, что я могу сделать сейчас.

Спасибо!


person user8402764    schedule 14.11.2017    source источник


Ответы (1)


Первоначально я пытался использовать объект BarChart для построения двухсторонней гистограммы, но после просмотра этого вопроса Я понял, что у StackedBarChart есть то, что я искал. Это код, который я использовал для создания двухсторонней гистограммы / столбчатой ​​диаграммы, чтобы все, кто интересуется, как это сделать:

    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);
}
}
person user8402764    schedule 14.11.2017