RainfallAnalyser / src / main / java / project / rainanalyser / betarelease / RainfallChart.java
RainfallChart.java
Raw
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<RainfallRecord> 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<RainfallRecord> 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<String, Number> barChart = new BarChart<>(xAxis, yAxis);
        barChart.setTitle("Rainfall Visualizer");
        xAxis.setLabel("Month");
        yAxis.setLabel("Rainfall (mm)");

        XYChart.Series<String, Number> series = new XYChart.Series<>();
        List<Double> 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<String, Number> data = new XYChart.Data<>(MONTHS[i], rainfall);
            series.getData().add(data);
        }
        barChart.getData().add(series);
        for (XYChart.Data<String, Number> 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<Double> readRainfallData(List<RainfallRecord> records) {
        List<Double> 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;
    }
}