package project.rainanalyser.betarelease; import javafx.geometry.Insets; import javafx.scene.chart.BarChart; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.util.ArrayList; import java.util.List; public class RainfallChart { private List records; private static final int CHART_WIDTH = 800; private static final int CHART_HEIGHT = 600; public static final String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; public RainfallChart(List records) { this.records = records; } public void show(Stage primaryStage, BorderPane root) { VBox vbox = new VBox(); vbox.setSpacing(10); vbox.setPadding(new Insets(10)); final CategoryAxis xAxis = new CategoryAxis(); final NumberAxis yAxis = new NumberAxis(); final BarChart barChart = new BarChart<>(xAxis, yAxis); barChart.setTitle("Rainfall Visualizer"); xAxis.setLabel("Month"); yAxis.setLabel("Rainfall (mm)"); XYChart.Series series = new XYChart.Series<>(); List rainfallData = readRainfallData(records); double minRainfall = Double.MAX_VALUE; double maxRainfall = Double.MIN_VALUE; for (int i = 0; i < MONTHS.length; i++) { double rainfall = rainfallData.get(i); if (rainfall < minRainfall) { minRainfall = rainfall; } if (rainfall > maxRainfall) { maxRainfall = rainfall; } XYChart.Data data = new XYChart.Data<>(MONTHS[i], rainfall); series.getData().add(data); } barChart.getData().add(series); for (XYChart.Data data : series.getData()) { if (data.getYValue().doubleValue() == maxRainfall) { data.getNode().setStyle("-fx-bar-fill: #146C94 ;"); // Set green color for the biggest month } else if (data.getYValue().doubleValue() == minRainfall) { data.getNode().setStyle("-fx-bar-fill: #AFD3E2;"); // Set red color for the smallest month } else { data.getNode().setStyle("-fx-bar-fill: #19A7CE;"); // Set blue color for the rest of the months } } barChart.setLegendVisible(false); vbox.getChildren().add(barChart); root.setCenter(vbox); } private List readRainfallData(List records) { List rainfallData = new ArrayList<>(); double[] monthlyTotal = new double[12]; int[] monthCount = new int[12]; for (RainfallRecord record : records) { int monthIndex = record.getDate().getMonthValue() - 1; monthlyTotal[monthIndex] += record.getRainfall(); monthCount[monthIndex]++; } for (int i = 0; i < MONTHS.length; i++) { if (monthCount[i] > 0) { double averageRainfall = monthlyTotal[i] / monthCount[i]; rainfallData.add(averageRainfall); } else { rainfallData.add(0.0); } } return rainfallData; } }