JavaFX - Gráfico de barras apiladas

StackedBarChart es una variación de BarChart, que traza barras que indican valores de datos para una categoría. Las barras pueden ser verticales u horizontales dependiendo de qué eje sea el eje de categoría. La barra de cada serie se apila sobre la serie anterior.

El siguiente es un gráfico de barras apiladas, que representa el crecimiento de la población.

En JavaFX, un gráfico de barras apiladas está representado por una clase llamada StackedBarChart. Esta clase pertenece al paquetejavafx.scene.chart. Al crear una instancia de esta clase, puede crear un nodo StackedBarChart en JavaFX.

Pasos para generar un gráfico de barras apiladas

Para generar un gráfico de barras apiladas en JavaFX, siga los pasos que se indican a continuación.

Paso 1: crear una clase

Cree una clase Java y herede la Application clase del paquete javafx.application. A continuación, puede implementar elstart() método de esta clase de la siguiente manera.

public class ClassName extends Application { 
   @Override     
   public void start(Stage primaryStage) throws Exception {     
   }    
}

Paso 2: Definición del eje

Defina los ejes X e Y del gráfico de barras apiladas y establezca etiquetas para ellos. En nuestro ejemplo, el eje X representa los continentes y el eje Y representa la población en millones.

//Defining the x axis               
CategoryAxis xAxis = new CategoryAxis();    

xAxis.setCategories(FXCollections.<String>observableArrayList(Arrays.asList
   ("Africa", "America", "Asia", "Europe", "Oceania"))); 
xAxis.setLabel("category");  

//Defining the y axis 
NumberAxis yAxis = new NumberAxis(); 
yAxis.setLabel("Population (In millions)");

Paso 3: creación del gráfico de barras apiladas

Cree un gráfico de líneas creando una instancia de la clase llamada StackedBarChart del paquete javafx.scene.chart. Al constructor de esta clase, pase los objetos que representan los ejes X e Y creados en el paso anterior.

//Creating the Bar chart 
StackedBarChart<String, Number> stackedBarChart = 
new StackedBarChart<>(xAxis, yAxis);         
stackedBarChart.setTitle("Historic World Population by Region");

Paso 4: preparar los datos

Instancia del XYChart.Series class y agregue los datos (una serie de coordenadas xey) a la lista Observable de esta clase de la siguiente manera:

//Prepare XYChart.Series objects by setting data 
XYChart.Series<String, Number> series1 = new XYChart.Series<>(); 
series1.setName("1800"); 
series1.getData().add(new XYChart.Data<>("Africa", 107)); 
series1.getData().add(new XYChart.Data<>("America", 31)); 
series1.getData().add(new XYChart.Data<>("Asia", 635)); 
series1.getData().add(new XYChart.Data<>("Europe", 203)); 
series1.getData().add(new XYChart.Data<>("Oceania", 2)); 
XYChart.Series<String, Number> series2 = new XYChart.Series<>();  

series2.setName("1900"); 
series2.getData().add(new XYChart.Data<>("Africa", 133)); 
series2.getData().add(new XYChart.Data<>("America", 156)); 
series2.getData().add(new XYChart.Data<>("Asia", 947)); 
series2.getData().add(new XYChart.Data<>("Europe", 408)); 
series1.getData().add(new XYChart.Data<>("Oceania", 6));  

XYChart.Series<String, Number> series3 = new XYChart.Series<>(); 
series3.setName("2008"); 
series3.getData().add(new XYChart.Data<>("Africa", 973)); 
series3.getData().add(new XYChart.Data<>("America", 914)); 
series3.getData().add(new XYChart.Data<>("Asia", 4054)); 
series3.getData().add(new XYChart.Data<>("Europe", 732)); 
series1.getData().add(new XYChart.Data<>("Oceania", 34));

Paso 5: agregar datos al gráfico de barras apiladas

Agregue la serie de datos preparada en el paso anterior al gráfico de barras de la siguiente manera:

//Setting the data to bar chart        
stackedBarChart.getData().addAll(series1, series2, series3);

Paso 6: creación de un objeto de grupo

En el start() método, cree un objeto de grupo instanciando la clase llamada Group. Esto pertenece al paquetejavafx.scene.

Pase el objeto StackedBarChart (nodo) creado en el paso anterior como parámetro al constructor de la clase Group. Esto debe hacerse para agregarlo al grupo de la siguiente manera:

Group root = new Group(stackedBarChart);

Paso 7: creación de un objeto de escena

Cree una escena creando una instancia de la clase llamada Scene, que pertenece al paquete javafx.scene. A esta clase, pase el objeto Grupo (raíz), creado en el paso anterior.

Además del objeto raíz, también puede pasar dos parámetros dobles que representan la altura y el ancho de la pantalla, junto con el objeto de la clase Group de la siguiente manera.

Scene scene = new Scene(group ,600, 300);

Paso 8: Establecer el título del escenario

Puede establecer el título del escenario utilizando el setTitle() método del Stageclase. EstaprimaryStage es un objeto Stage, que se pasa al método de inicio de la clase de escena como parámetro.

Utilizando el primaryStage objeto, establezca el título de la escena como Sample Application como sigue.

primaryStage.setTitle("Sample Application");

Paso 9: Agregar escena al escenario

Puede agregar un objeto de escena al escenario usando el método setScene()de la clase denominada Stage. Agregue el objeto Scene preparado en los pasos anteriores utilizando este método de la siguiente manera.

primaryStage.setScene(scene);

Paso 10: Visualización del contenido del escenario

Muestre el contenido de la escena usando el método llamado show() del Stage clase de la siguiente manera.

primaryStage.show();

Paso 11: Lanzamiento de la aplicación

Inicie la aplicación JavaFX llamando al método estático launch() del Application class del método principal de la siguiente manera.

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

Ejemplo

La siguiente tabla enumera la población en varios continentes en los años 1800, 1900 y 2008.

África America Asia Europa Oceanía
1800 107 31 635 203 2
1900 133 156 947 408 6
2008 973 914 4054 732 34

A continuación se muestra un programa Java que genera un gráfico de barras apiladas que muestra los datos anteriores, utilizando JavaFX.

Guarde este código en un archivo con el nombre StackedBarChartExample.java.

import java.util.Arrays; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.chart.CategoryAxis; 
import javafx.stage.Stage; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.StackedBarChart; 
import javafx.scene.chart.XYChart; 
         
public class StackedBarChartExample extends Application { 
   @Override 
   public void start(Stage stage) {     
      //Defining the axes               
      CategoryAxis xAxis = new CategoryAxis();    
      xAxis.setCategories(FXCollections.<String>observableArrayList(Arrays.asList
         ("Africa", "America", "Asia", "Europe", "Oceania"))); 
      
      xAxis.setLabel("category");
      NumberAxis yAxis = new NumberAxis(); 
      yAxis.setLabel("Population (In millions)");    
         
      //Creating the Bar chart 
      StackedBarChart<String, Number> stackedBarChart = 
         new StackedBarChart<>(xAxis, yAxis);         
      stackedBarChart.setTitle("Historic World Population by Region"); 
         
      //Prepare XYChart.Series objects by setting data 
      XYChart.Series<String, Number> series1 = new XYChart.Series<>();  
      series1.setName("1800"); 
      series1.getData().add(new XYChart.Data<>("Africa", 107)); 
      series1.getData().add(new XYChart.Data<>("America", 31));  
      series1.getData().add(new XYChart.Data<>("Asia", 635)); 
      series1.getData().add(new XYChart.Data<>("Europe", 203)); 
      series1.getData().add(new XYChart.Data<>("Oceania", 2)); 
         
      XYChart.Series<String, Number> series2 = new XYChart.Series<>(); 
      series2.setName("1900"); 
      series2.getData().add(new XYChart.Data<>("Africa", 133)); 
      series2.getData().add(new XYChart.Data<>("America", 156)); 
      series2.getData().add(new XYChart.Data<>("Asia", 947)); 
      series2.getData().add(new XYChart.Data<>("Europe", 408)); 
      series1.getData().add(new XYChart.Data<>("Oceania", 6));  
     
      XYChart.Series<String, Number> series3 = new XYChart.Series<>(); 
      series3.setName("2008"); 
      series3.getData().add(new XYChart.Data<>("Africa", 973)); 
      series3.getData().add(new XYChart.Data<>("America", 914)); 
      series3.getData().add(new XYChart.Data<>("Asia", 4054)); 
      series3.getData().add(new XYChart.Data<>("Europe", 732)); 
      series1.getData().add(new XYChart.Data<>("Oceania", 34)); 
         
      //Setting the data to bar chart
      stackedBarChart.getData().addAll(series1, series2, series3); 
         
      //Creating a Group object  
      Group root = new Group(stackedBarChart); 
         
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 400);  
      
      //Setting title to the Stage 
      stage.setTitle("stackedBarChart"); 
         
      //Adding scene to the stage 
      stage.setScene(scene); 
         
      //Displaying the contents of the stage 
      stage.show();         
   } 
   public static void main(String args[]){ 
      launch(args); 
   } 
}

Compile y ejecute el archivo java guardado desde el símbolo del sistema utilizando los siguientes comandos.

javac StackedBarChartExample.java 
java StackedBarChartExample

Al ejecutarse, el programa anterior genera una ventana JavaFX que muestra un gráfico de áreas como se muestra a continuación.