2016-05-04 4 views
0

Ich möchte eine StackedBarChart mit Gruppen erstellen, aber ich konnte keine Möglichkeit finden, es zu tun. Was ich habe, ist wie folgt aus:JavaFX-StackedBarChart mit Gruppen

public class TestStackedBarChart extends Application { 

public static void main(String[] args) { 
    launch(args); 
} 
@Override 
public void start(Stage primaryStage) { 
    Group root = new Group(); 

    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 

    xAxis.setLabel("Month"); 
    xAxis.setCategories(FXCollections.<String> observableArrayList(Arrays.asList(
      "January", 
      "February", 
      "March"))); 
    yAxis.setLabel("Value"); 

    final StackedBarChart<String,Number> stackedBarChart = new StackedBarChart<>(xAxis,yAxis); 
    stackedBarChart.setTitle("StackedBarChart"); 

    XYChart.Series<String,Number> series1 = new Series<>(); 
    series1.setName("XYChart.Series 1");  

    series1.getData().add(new Data<String, Number>("January", Integer.valueOf(100))); 
    series1.getData().add(new Data<String, Number>("February", Integer.valueOf(200))); 
    series1.getData().add(new Data<String, Number>("March", Integer.valueOf(50))); 

    XYChart.Series<String,Number> series2 = new Series<>(); 
    series2.setName("XYChart.Series 2"); 

    series2.getData().add(new Data<String, Number>("January", Integer.valueOf(150))); 
    series2.getData().add(new Data<String, Number>("February", Integer.valueOf(100))); 
    series2.getData().add(new Data<String, Number>("March", Integer.valueOf(60))); 

    stackedBarChart.getData().add(series1); 
    stackedBarChart.getData().add(series2); 

    root.getChildren().addAll(stackedBarChart); 

    primaryStage.setScene(new Scene(root, 500, 400)); 
    primaryStage.show(); 
} 
} 

Und das ist das Ergebnis:

StackedBarChart (Actual)

Was ich haben will, ist so etwas wie das:

StackedBarChart (Target)

Gibt es eine Möglichkeit, es in JavaFx zu tun? Sie könnten auch einen anderen Chart-Typ vorschlagen, aber die Lösung sollte mit JavaFX sein.

+0

Es sei denn, im Irrtum, XYChart.series ist eine von Region erstreckt, was bedeutet, sollte es eine Polsterung haben. Um mehrere Balken pro Monat zu erstellen, werfen Sie einen Blick auf [link] (https://docs.oracle.com/javafx/2/charts/bar-chart.htm). Hinweis: Ich habe nicht viele BarCharts, nur für ein kleines Diagramm, damit ich falsch liegen könnte. Aber die Lösung wäre, dem Beispiel von Orakel zu folgen und dann das Padding von den Balken zu entfernen, an denen Sie kein Leerzeichen wollen. – namlik

+0

@namlik Ich glaube, du hast falsch verstanden, wonach ich suche. Ich suche nach einer Lösung, um die Elemente zu gruppieren, zum Beispiel Product1,2,3-> Grouped im Januar. Padding hat nichts mit meiner Frage zu tun. – Endery

+0

Nun zeigt der Link kein Beispiel dafür? Im ersten Beispiel werden die Bars nach Ländern gruppiert. Vielleicht habe ich wegen der Wand des Textes darüber nachgedacht, normalerweise, wenn Sie die dort gegebenen Methoden und Beispiele kombinieren, sollten Sie in der Lage sein, eine Lösung zu erreichen, mit der Sie hier glücklich sind -> [KLIK HIER] (https://docs.oracle .com/javafx/2/charts/bar-chart.htm) – namlik

Antwort

0

Nachdem ich eine Weile mit dem gestapelten Balkendiagramm experimentiert habe, habe ich eine akzeptable Lösung gefunden. Es war nicht möglich, die gestapelten Balkenknoten zu gruppieren, aber es war möglich, sie so zu sortieren, dass die gruppierten Einträge nebeneinander liegen. Hier ist das Ergebnis:

StackedBarChart with sorting

Und hier ist, wie ich es tat:

public class TestStackedBarChart extends Application { 

public static void main(String[] args) { 
    launch(args); 
} 
@Override 
public void start(Stage primaryStage) { 
    Group root = new Group(); 

    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 

    xAxis.setLabel("Month"); 
    xAxis.setCategories(FXCollections.<String> observableArrayList(Arrays.asList(
      "January(Plan)", 
      "January(Actual)", 
      "February(Plan)", 
      "February(Actual)", 
      "March(Plan)", 
      "March(Actual)"))); 
    yAxis.setLabel("Value"); 


    final StackedBarChart<String,Number> stackedBarChart = new StackedBarChart<>(xAxis,yAxis); 
    stackedBarChart.setTitle("StackedBarChart");   

    XYChart.Series<String,Number> series1 = new Series<>(); 
    series1.setName("Category A"); 
    series1.getData().add(new Data<>("January(Plan)", Integer.valueOf(100))); 
    series1.getData().add(new Data<>("February(Plan)", Integer.valueOf(200))); 
    series1.getData().add(new Data<>("March(Plan)", Integer.valueOf(50))); 

    XYChart.Series<String,Number> series2 = new Series<>(); 
    series2.setName("Category B"); 
    series2.getData().add(new Data<>("January(Plan)", Integer.valueOf(200))); 
    series2.getData().add(new Data<>("February(Plan)", Integer.valueOf(100))); 
    series2.getData().add(new Data<>("March(Plan)", Integer.valueOf(25)));   

    XYChart.Series<String,Number> series3 = new Series<>(); 
    series3.setName("Actual Value");   
    series3.getData().add(new Data<String, Number>("January(Actual)", Integer.valueOf(250))); 
    series3.getData().add(new Data<String, Number>("February(Actual)", Integer.valueOf(275))); 
    series3.getData().add(new Data<String, Number>("March(Actual)", Integer.valueOf(60))); 

    stackedBarChart.getData().add(series1); 
    stackedBarChart.getData().add(series2); 
    stackedBarChart.getData().add(series3); 

    root.getChildren().addAll(stackedBarChart); 

    primaryStage.setScene(new Scene(root, 500, 400)); 
    primaryStage.show(); 
} 
}