{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import xarray as xr\n", "\n", "# Specify the path to your NetCDF file\n", "file_path = 'transect_r20240117.nc'\n", "file_path = r'C:\\Users\\fuentesm\\Marilu\\Deltares\\Projects\\Westerchelde\\Data\\S2A_MSI_2015_07_16_10_50_24_merged_westerschelde_L2W.nc'\n", "#file_path ='http://opendap.deltares.nl/thredds/dodsC/opendap/rijkswaterstaat/jarkus/profiles/transect.nc' \n", "\n", "# Open the NetCDF file with xarray\n", "ds = xr.open_dataset(file_path)\n", "\n", "# Display the dataset information\n", "# print(ds)\n" ] }, { "cell_type": "code", "execution_count": 267, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data/S2A_MSI_2015_07_16_10_50_24_merged_westerschelde_L2W.nc\n", "C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data/S2A_MSI_2023_08_23_10_56_47_merged_westerschelde_L2W.nc\n" ] } ], "source": [ "import os\n", "import xarray as xr\n", "from datetime import datetime\n", "import matplotlib.pyplot as plt\n", "from datetime import datetime\n", "import pandas as pd\n", "import altair as alt\n", "import numpy as np\n", "\n", "folder_path = 'C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data/'\n", "folder_path_stations = 'C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data/Stations.xlsx' \n", "\n", "# List all files in the folder\n", "files_in_folder = os.listdir(folder_path)\n", "\n", "# Filter the list to include only files ending with \"ic.nc\"\n", "filtered_files = [file for file in files_in_folder if file.endswith(\"L2W.nc\")]\n", "\n", "filtered_files.sort()\n", "\n", "datasets_list = []\n", "# Print the list of matching files\n", "for file in filtered_files:\n", " path = os.path.join(folder_path , file)\n", " print(path)\n", " dataset = xr.open_dataset(path)\n", " time_series = [datetime.fromisoformat(dataset.attrs.get(\"isodate\"))] # Replace with your time series data\n", " ##new_dataset = xr.concat([dataset[\"chl_re_gons\"]], dim=xr.DataArray(time_series, coords={\"time\": time_series}, dims=[\"time\"]))\n", " new_dataset = xr.concat([dataset], dim=xr.DataArray(time_series, coords={\"time\": time_series}, dims=[\"time\"]))\n", " datasets_list.append(new_dataset)\n", "\n", "merged_data = xr.concat(datasets_list, dim='time')\n" ] }, { "cell_type": "code", "execution_count": 268, "metadata": {}, "outputs": [], "source": [ "def get_window(x_coord, y_coord, stationID):\n", " time_series = merged_data.sel(x=x_coord, y=y_coord, method='nearest')\n", " y_coord_exact = time_series['y'].values.tolist()\n", " x_coord_exact = time_series['x'].values.tolist()\n", " y_index = np.where(merged_data['y'] == y_coord_exact)[0].tolist()[0]\n", " x_index = np.where(merged_data['x'] == x_coord_exact)[0].tolist()[0]\n", " central_lon = x_index\n", " central_lat = y_index\n", "\n", " lat_start, lat_end = central_lat - 1, central_lat + 2\n", " lon_start, lon_end = central_lon - 1, central_lon + 2\n", "\n", " window_values = merged_data.isel(y=slice(lat_start, lat_end), x=slice(lon_start, lon_end))\n", " window_values = window_values.expand_dims(station=[stationID])\n", "\n", " return window_values\n", "\n", "# stationID = 'S1'\n", "# station = 'SCHAARVODDL\tSchaar van Ouden Doel'\n", "# lon = 4.250932603\n", "# lat = 51.35118367\n", "# x_coord = 5.8711167e+05 #5.208e+05 \n", "# y_coord = 5.68962179e+06\n", "\n", "# stationID = 'S2'\n", "# station = 'VLISSGNLDK\tVlissingen Nolledijk'\n", "# lon = 3.553066,\t\n", "# lat = 51.450453\n", "# x_coord = 5.3843131e+05 \n", "# y_coord = 5.70006397e+06 \n", "\n", "df = pd.read_excel(folder_path_stations)\n", "\n", "stations_list = []\n", "for index, row in df.iterrows():\n", " # print(row['stationID'])\n", " station_window = get_window(row['x_coord'], row['y_coord'], row['stationID'])\n", " stations_list.append(station_window)\n", "\n", "merged_stations = xr.concat(stations_list, dim='station')\n", "# station1 = get_window(x_coord, y_coord, stationID)" ] }, { "cell_type": "code", "execution_count": 269, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:              (x: 6, y: 6, time: 2, station: 2)\n",
       "Coordinates:\n",
       "  * x                    (x) float64 5.384e+05 5.384e+05 ... 5.871e+05 5.872e+05\n",
       "  * y                    (y) float64 5.69e+06 5.69e+06 ... 5.7e+06 5.7e+06\n",
       "  * time                 (time) object 1437043824456000000 1692788207527148000\n",
       "  * station              (station) object 'S1' 'S2'\n",
       "Data variables:\n",
       "    transverse_mercator  (station, time) float64 9.969e+36 ... 9.969e+36\n",
       "    lon                  (station, time, y, x) float32 nan nan nan ... nan nan\n",
       "    lat                  (station, time, y, x) float32 nan nan nan ... nan nan\n",
       "    l2_flags             (station, time, y, x) float64 nan nan nan ... nan nan\n",
       "    chl_re_gons          (station, time, y, x) float32 nan nan nan ... nan nan\n",
       "Attributes: (12/381)\n",
       "    generated_by:                              ACOLITE\n",
       "    generated_on:                              2024-01-18 10:07:11 CET\n",
       "    contact:                                   Quinten Vanhellemont\n",
       "    product_type:                              NetCDF\n",
       "    metadata_profile:                          beam\n",
       "    metadata_version:                          0.5\n",
       "    ...                                        ...\n",
       "    luts:                                      ['ACOLITE-LUT-202110-MOD1', 'A...\n",
       "    luts_pressures:                            [ 500  750 1013 1100]\n",
       "    slicing:                                   False\n",
       "    scene_download:                            False\n",
       "    runid:                                     20240118_100708\n",
       "    inputfile:                                 ['/eodc/private/deltares/INPUT...
" ], "text/plain": [ "\n", "Dimensions: (x: 6, y: 6, time: 2, station: 2)\n", "Coordinates:\n", " * x (x) float64 5.384e+05 5.384e+05 ... 5.871e+05 5.872e+05\n", " * y (y) float64 5.69e+06 5.69e+06 ... 5.7e+06 5.7e+06\n", " * time (time) object 1437043824456000000 1692788207527148000\n", " * station (station) object 'S1' 'S2'\n", "Data variables:\n", " transverse_mercator (station, time) float64 9.969e+36 ... 9.969e+36\n", " lon (station, time, y, x) float32 nan nan nan ... nan nan\n", " lat (station, time, y, x) float32 nan nan nan ... nan nan\n", " l2_flags (station, time, y, x) float64 nan nan nan ... nan nan\n", " chl_re_gons (station, time, y, x) float32 nan nan nan ... nan nan\n", "Attributes: (12/381)\n", " generated_by: ACOLITE\n", " generated_on: 2024-01-18 10:07:11 CET\n", " contact: Quinten Vanhellemont\n", " product_type: NetCDF\n", " metadata_profile: beam\n", " metadata_version: 0.5\n", " ... ...\n", " luts: ['ACOLITE-LUT-202110-MOD1', 'A...\n", " luts_pressures: [ 500 750 1013 1100]\n", " slicing: False\n", " scene_download: False\n", " runid: 20240118_100708\n", " inputfile: ['/eodc/private/deltares/INPUT..." ] }, "execution_count": 269, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_stations" ] }, { "cell_type": "code", "execution_count": 270, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "9.5094\n", "8.627829\n", "9.061846\n", "nan\n", "nan\n", "nan\n", "10.720591\n", "8.832928\n", "9.110658\n", "nan\n", "nan\n", "nan\n", "9.434819\n", "9.329641\n", "9.309038\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n", "nan\n" ] } ], "source": [ "# Extract variable name (replace with your actual variable name)\n", "variable_name = 'chl_re_gons'\n", "\n", "# Get the latitude and longitude coordinates\n", "latitudes = merged_stations['y'].values\n", "longitudes = merged_stations['x'].values\n", "times = merged_stations['time'].values\n", "stations = merged_stations['station'].values\n", "\n", "# Initialize lists to store data\n", "pixel_values = []\n", "coordinates = []\n", "\n", "# Iterate over latitudes and longitudes\n", "for station_index, station in enumerate(stations):\n", " for time_index, time in enumerate(times):\n", " for lat_index, lat in enumerate(latitudes):\n", " for lon_index, lon in enumerate(longitudes):\n", " \n", " # Extract pixel value\n", " ##pixel_value = merged_stations[variable_name].isel(y=lat_index, x=lon_index, time=time_index, station=station_index).values.item()\n", " pixel_value = merged_stations[variable_name].sel(station=station).isel(y=lat_index, x=lon_index, time=time_index).values\n", " print(pixel_value)\n", "\n", " # Append data to lists\n", " pixel_values.append(pixel_value)\n", " coordinates.append((lat, lon, station, time))\n", "\n", "\n", "df = pd.DataFrame({\n", " 'Latitude': [coord[0] for coord in coordinates],\n", " 'Longitude': [coord[1] for coord in coordinates],\n", " 'Station': [coord[2] for coord in coordinates],\n", " 'Time': [coord[3] for coord in coordinates],\n", " 'Pixel_Value': pixel_values\n", "})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create a DataFrame\n", "df = pd.DataFrame({\n", " 'Latitude': [coord[0] for coord in coordinates],\n", " 'Longitude': [coord[1] for coord in coordinates],\n", " 'Pixel_Value': pixel_values\n", "})\n", "\n", "# Save the DataFrame to an Excel file\n", "excel_output_path = 'pixel_values_coordinates.xlsx'\n", "df.to_excel(excel_output_path, index=False)\n", "\n", "# Close the xarray dataset\n", "ds.close()\n", "\n", "print(f'Data exported to {excel_output_path}')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "# Specify the 'x' and 'y' coordinates for the time series\n", "stationID = '1'\n", "x_coord = 5.8711167e+05 #5.208e+05\n", "y_coord = 5.68962179e+06 #5.712e+06\n", "\n", "# Extract the time series at the specified 'x' and 'y' coordinates\n", "time_series = merged_data.sel(x=x_coord, y=y_coord, method='nearest')\n", "y_coord_exact = time_series['y'].values.tolist()\n", "x_coord_exact = time_series['x'].values.tolist()\n", "y_index = np.where(merged_data['y'] == y_coord_exact)[0].tolist()[0]\n", "x_index = np.where(merged_data['x'] == x_coord_exact)[0].tolist()[0]\n", "\n", "central_lon = x_index\n", "central_lat = y_index\n", "\n", "lat_start, lat_end = central_lat - 1, central_lat + 2\n", "lon_start, lon_end = central_lon - 1, central_lon + 2\n", "\n", "window_values = merged_data.isel(y=slice(lat_start, lat_end), x=slice(lon_start, lon_end))\n", "window_values = window_values.expand_dims(station=[stationID])" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:              (station: 1, time: 2, x: 3, y: 3)\n",
       "Coordinates:\n",
       "  * station              (station) object '1'\n",
       "  * x                    (x) float64 5.871e+05 5.871e+05 5.872e+05\n",
       "  * y                    (y) float64 5.69e+06 5.69e+06 5.69e+06\n",
       "  * time                 (time) object 1437043824456000000 1692788207527148000\n",
       "Data variables:\n",
       "    transverse_mercator  (station, time) float64 9.969e+36 9.969e+36\n",
       "    lon                  (station, time, y, x) float32 4.25 4.251 ... 4.252\n",
       "    lat                  (station, time, y, x) float32 51.35 51.35 ... 51.35\n",
       "    l2_flags             (station, time, y, x) int32 1 1 1 1 1 1 ... 0 0 0 0 0 0\n",
       "    chl_re_gons          (station, time, y, x) float32 nan nan ... 8.628 9.062\n",
       "Attributes: (12/381)\n",
       "    generated_by:                              ACOLITE\n",
       "    generated_on:                              2024-01-18 10:07:11 CET\n",
       "    contact:                                   Quinten Vanhellemont\n",
       "    product_type:                              NetCDF\n",
       "    metadata_profile:                          beam\n",
       "    metadata_version:                          0.5\n",
       "    ...                                        ...\n",
       "    luts:                                      ['ACOLITE-LUT-202110-MOD1', 'A...\n",
       "    luts_pressures:                            [ 500  750 1013 1100]\n",
       "    slicing:                                   False\n",
       "    scene_download:                            False\n",
       "    runid:                                     20240118_100708\n",
       "    inputfile:                                 ['/eodc/private/deltares/INPUT...
" ], "text/plain": [ "\n", "Dimensions: (station: 1, time: 2, x: 3, y: 3)\n", "Coordinates:\n", " * station (station) object '1'\n", " * x (x) float64 5.871e+05 5.871e+05 5.872e+05\n", " * y (y) float64 5.69e+06 5.69e+06 5.69e+06\n", " * time (time) object 1437043824456000000 1692788207527148000\n", "Data variables:\n", " transverse_mercator (station, time) float64 9.969e+36 9.969e+36\n", " lon (station, time, y, x) float32 4.25 4.251 ... 4.252\n", " lat (station, time, y, x) float32 51.35 51.35 ... 51.35\n", " l2_flags (station, time, y, x) int32 1 1 1 1 1 1 ... 0 0 0 0 0 0\n", " chl_re_gons (station, time, y, x) float32 nan nan ... 8.628 9.062\n", "Attributes: (12/381)\n", " generated_by: ACOLITE\n", " generated_on: 2024-01-18 10:07:11 CET\n", " contact: Quinten Vanhellemont\n", " product_type: NetCDF\n", " metadata_profile: beam\n", " metadata_version: 0.5\n", " ... ...\n", " luts: ['ACOLITE-LUT-202110-MOD1', 'A...\n", " luts_pressures: [ 500 750 1013 1100]\n", " slicing: False\n", " scene_download: False\n", " runid: 20240118_100708\n", " inputfile: ['/eodc/private/deltares/INPUT..." ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "window_values" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data//plot_ch.png\n", "C:/Users/fuentesm/Marilu/Deltares/Projects/Westerchelde/Data//plot_ch_atl.html\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAJFCAYAAADqEKf2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABl1UlEQVR4nO3deZyN9f//8eeZMftmnxmMGbvslexl33cJqeyfiLImW3YS+ohWFSWSRLYkZopGPiFCSVHJziBiMJZZ3r8/+s35Oma5zmHGTOZxv93Orc77el/X9brOnDNnnq739b5sxhgjAAAAAECa3LK6AAAAAADI7ghOAAAAAGCB4AQAAAAAFghOAAAAAGCB4AQAAAAAFghOAAAAAGCB4AQAAAAAFghOAAAAAGCB4AQAAAAAFghOAIBMtWDBAtlsNu3cudOyb7169VSvXr3MLwoAABcRnAAAAADAAsEJAHDPiYuLy+oSAAD3GIITAOCO7d+/X48//riCg4Pl5eWlokWLqlu3brp+/bq9z6VLl/TMM88of/78ypcvnzp06KCTJ0/e8b7r1aunChUqaPPmzapVq5Z8fX3Vq1cvSVJsbKyef/55FStWTJ6enipcuLAGDx6sK1euuLyf9957T6VLl5aXl5fKlSunjz/+WD169FBERIRDv/Pnz6t///4qXLiwPD09Vbx4cY0ZM8bhtZAkm82mZ599VosWLdJ9990nX19fVa5cWWvXrnXod/bsWT399NMKCwuTl5eXChQooNq1a+urr75y+RgAALcvV1YXAAD4d/vxxx9Vp04d5c+fX5MmTVKpUqV06tQprVmzRjdu3LD369Onj1q2bKmPP/5Yx44d0/Dhw/Xkk09q48aNd1zDqVOn9OSTT+qFF17QSy+9JDc3N8XFxalu3bo6fvy4Ro8erUqVKmnfvn0aN26c9u7dq6+++ko2m82p7b/77rvq27evHn30Ub366qu6ePGiJk6cmCIMXbt2TfXr19fBgwc1ceJEVapUSd9++62mTZumPXv26IsvvnDo/8UXX2jHjh2aNGmS/P39NWPGDLVv314HDhxQ8eLFJUlPPfWUdu3apalTp6p06dK6cOGCdu3apXPnzt3x6wYAcIEBAOAONGjQwOTOnducOXMm1eUffPCBkWT69+/v0D5jxgwjyZw6dcreVrduXVO3bl2X9l+3bl0jyXz99dcO7dOmTTNubm5mx44dDu3Lly83ksy6deuc2n5iYqIJCQkx1atXd2g/cuSI8fDwMOHh4fa2uXPnGknm008/deg7ffp0I8lERkba2ySZ4OBgExsba2+LiYkxbm5uZtq0afY2f39/M3jwYKdqBQBkHobqAQBuW1xcnKKjo9WpUycVKFAg3b5t2rRxeF6pUiVJ0pEjR+64jjx58qhBgwYObWvXrlWFChVUpUoVJSQk2B9NmzaVzWbTN99849S2Dxw4oJiYGHXq1MmhvWjRoqpdu7ZD28aNG+Xn56eOHTs6tPfo0UOS9PXXXzu0169fXwEBAfbnwcHBKliwoMNrUq1aNS1YsEBTpkzRtm3bFB8f71TdAICMRXACANy2v//+W4mJiSpSpIhl33z58jk89/LykiRdvXr1jusIDQ1N0Xb69Gn99NNP8vDwcHgEBATIGKO//vrLqW0nD4kLDg5OsezWtnPnzikkJCTFEMCCBQsqV65cKYbX3fqaSP+8Lje/JkuXLlX37t01b9481axZU3nz5lW3bt0UExPjVP0AgIzBNU4AgNuWN29eubu76/jx41laR2rXKuXPn18+Pj56//33U10nf/78Tm07OdycPn06xbJbw0u+fPm0fft2GWMcajpz5owSEhKc3uetdc6ePVuzZ8/W0aNHtWbNGo0cOVJnzpzR+vXrXd4eAOD2cMYJAHDbfHx8VLduXS1btszpMzh3S6tWrXTw4EHly5dPVatWTfG4dTa8tJQpU0YhISH69NNPHdqPHj2q7777zqGtYcOGunz5slatWuXQvnDhQvvyO1G0aFE9++yzaty4sXbt2nVH2wIAuIYzTgCAOzJr1izVqVNH1atX18iRI1WyZEmdPn1aa9as0TvvvJNldQ0ePFifffaZHnnkEQ0ZMkSVKlVSUlKSjh49qsjISA0bNkzVq1e33I6bm5smTpyovn37qmPHjurVq5cuXLigiRMnKjQ0VG5u//dvkN26ddObb76p7t276/Dhw6pYsaK2bNmil156SS1atFCjRo1cOoaLFy+qfv366tq1q8qWLauAgADt2LFD69evV4cOHVx+TQAAt4/gBAC4I5UrV9b333+v8ePHa9SoUbp06ZJCQkLUoEEDeXp6Zlldfn5++vbbb/Xyyy/r3Xff1aFDh+Tj46OiRYuqUaNGTp9xkqSnn35aNpvNPl14RESERo4cqdWrV+vo0aP2ft7e3tq0aZPGjBmjmTNn6uzZsypcuLCef/55jR8/3uVj8Pb2VvXq1bVo0SIdPnxY8fHxKlq0qEaMGKEXXnjB5e0BAG6fzRhjsroIAAD+bS5cuKDSpUurXbt2evfdd7O6HABAJuOMEwAAFmJiYjR16lTVr19f+fLl05EjR/Tqq6/q0qVLGjRoUFaXBwC4CwhOAIBsKTExUekNirDZbHJ3d7+jfSQlJSkpKSndPrly5ZKXl5cOHz6s/v376/z58/L19VWNGjU0d+5clS9f/o5qAAD8OzBUDwCQLdWrV0/R0dFpLg8PD9fhw4fvaB89evTQhx9+mG4fviYBABLBCQCQTR04cECXLl1Kc7mXl5cqVqx4R/s4fPiw5TTqVatWvaN9AADuDQQnAAAAALDADXABAAAAwALBCQAyyeHDh2Wz2bRgwYJM3c+WLVvUp08fPfjgg/Ly8pLNZkv32p/XX39dZcuWlZeXl4oVK6aJEycqPj7e6f39+eefevbZZ1W6dGn5+PjI19dX5cuX14svvqgTJ07Y+/Xo0UP+/v5pbsff3189evSwP09+vV555RWna7nV2rVr1bZtWxUqVEienp4KCAjQ/fffr/Hjxzvcbyk7WbBggWw2m/1hNXTwXnDs2DG1b99exYsXl5+fn4KCgnT//ffrjTfeUEJCgkPfwYMH21+b9N5PAJDZCE4A8C/39ddf66uvvlLRokVVq1atdPtOnTpVgwYNUocOHbRhwwb1799fL730kgYMGODUvtauXatKlSpp7dq1evrpp7V27Vr7/3/++edq1apVRhySy5KSktS9e3e1bt1a8fHxmjZtmqKiorRs2TJ16NBBixYtUu3atbOkNmetWLFCW7duVe7cubO6lEx35coVBQYGauzYsVqzZo0++eQT1alTR88995z69evn0HfIkCHaunWrWrRokUXVAsD/ZwAAmeLQoUNGkvnggw8ydT+JiYn2/585c6aRZA4dOpSi319//WW8vb3N008/7dA+depUY7PZzL59+9Ldz59//mn8/PzM/fffby5cuJBieVJSkvnss8/sz7t37278/PzS3J6fn5/p3r27/Xny6zVz5sx060jNSy+9ZCSZadOmpbo8Pj7evPHGGy5v92744IMP0vyZ5TSdOnUyuXLlMteuXUuxzOr9BACZjTNOAHCXbdmyRQ0bNlRAQIB8fX1Vq1YtffHFF6n2q1mzpry9vVW4cGGNHTtW8+bNSzEUz83NuV/l69ev17Vr19SzZ0+H9p49e8oYo1WrVqW7/qxZs3TlyhW99dZbCgoKSrHcZrOpQ4cOTtWSkW7cuKEZM2aoQoUKGjlyZKp9cuXKleKsWlJSkmbMmGEftliwYEF169ZNx48fd+hXr149VahQQTt27NDDDz8sX19fFS9eXC+//LLDPaCSkpI0ZcoUlSlTRj4+PsqdO7cqVaqkOXPm3PaxJe9769atqlWrlnx8fBQREaEPPvhAkvTFF1/ogQcekK+vrypWrKj169en2Mbq1atVqVIleXl5qXjx4pozZ44mTJggm812V/bvigIFCsjNze2O788FAJmBG+ACwF0UHR2txo0bq1KlSpo/f768vLz01ltvqXXr1lqyZIk6d+4sSfrpp5/UuHFjlS5dWh9++KF8fX01d+5cffTRR7e9759//lmSUkzhHRoaqvz589uXpyUyMlLBwcGqUaOGS/u99ZqVjLZz505duHBBzzzzjEvrPfPMM3r33Xf17LPPqlWrVjp8+LDGjh2rb775Rrt27VL+/PntfWNiYvTEE09o2LBhGj9+vFauXKlRo0apUKFC6tatmyRpxowZmjBhgl588UU98sgjio+P1/79+3XhwoU7Or6YmBj17NlTL7zwgooUKaLXX39dvXr10rFjx7R8+XKNHj1aQUFBmjRpktq1a6c///xThQoVkvRPWO7QoYMeeeQRLV26VAkJCXrllVd0+vTpu7J/K8YYJSYm6tKlS4qMjNSCBQs0bNgw5crFnycAsqGsPuUFAPeq1Ibq1ahRwxQsWNBcunTJ3paQkGAqVKhgihQpYpKSkowxxjz22GPGz8/PnD171t4vMTHRlCtXLt1hXekN1fvPf/5jvLy8Ul2vdOnSpkmTJukej7e3t6lRo0a6fW7WvXt3IyndR0YM1fvkk0+MJDN37twUy+Lj4x0eyX799VcjyfTv39+h//bt240kM3r0aHtb3bp1jSSzfft2h77lypUzTZs2tT9v1aqVqVKliku1G5P+UL3kfe/cudPedu7cOePu7m58fHzMiRMn7O179uwxksxrr71mb3vooYdMWFiYuX79ur3t0qVLJl++fMaZPwHudP9Wpk2bZn8v2Gw2M2bMmDT7MlQPQFZjqB4A3CVXrlzR9u3b1bFjR4fZwdzd3fXUU0/p+PHjOnDggKR/zkw1aNDA4ayHm5ubOnXqdEc1pDc8y5mhW67y8fHRjh07Un34+Phk+P5uduHCBXl4eDg8du7cKUnatGmTJDnM6idJ1apV03333aevv/7aoT0kJETVqlVzaKtUqZKOHDnisO6PP/6o/v37a8OGDYqNjc2Q4wgNDdWDDz5of543b14VLFhQVapUcTizc99990mSvaYrV65o586dateunTw9Pe39/P391bp160zfv/TP2cabH+aWW0f26NFDO3bs0IYNG/TCCy9o5syZeu6555yuDQDuJs6FA8Bd8vfff8sYo9DQ0BTLkv8APXfunP2/wcHBKfql1uasfPny6dq1a4qLi5Ovr6/DsvPnzzv8cZyaokWL6tChQy7t083NTVWrVk1zWUYoWrSoJMc/2CUpICBAO3bskPTPbIATJ060L0t+ndP6Wdy6rXz58qXo5+XlpatXr9qfjxo1Sn5+fvroo480d+5cubu765FHHtH06dPTfA2ckTdv3hRtnp6eKdqTw9G1a9ck/d/77U7fR7e7/8OHD6tYsWIOfTZt2qR69erZn4eEhCgkJESS1KRJE+XJk0cjR45Ur169dP/99ztdIwDcDZxxAoC7JE+ePHJzc9OpU6dSLDt58qQk2c8w5cuXL9XrUGJiYm57/8nXNu3duzfFNv/66y9VqFAh3fWbNm2q06dPa9u2bbddQ2Z48MEHlSdPHn3++ecO7e7u7qpataqqVq2qiIgIh2XJQSitn8XNZ/qclStXLg0dOlS7du3S+fPntWTJEh07dkxNmzZVXFycy9u7U3ny5JHNZsvw95GzChUqlOIso1U4Tz6r99tvv2V6fQDgKoITANwlfn5+ql69ulasWOFwpiIpKUkfffSRihQpotKlS0uS6tatq40bNzrcDDUpKUnLli277f03a9ZM3t7eKW7Im3wD1nbt2qW7/pAhQ+Tn56f+/fvr4sWLKZYbY7Ry5crbru92eXp6avjw4fr55581ffp0p9Zp0KCBJKWYbGPHjh369ddf1bBhwzuqKXfu3OrYsaMGDBig8+fPp3tD4szi5+enqlWratWqVbpx44a9/fLly1q7dm2m79/T09MeXJMfAQEB6a6TPISyZMmSmV4fALiKoXoAcBdNmzZNjRs3Vv369fX888/L09NTb731ln7++WctWbLEfp3R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dHS0atWqJUkaNmxYhhcKAAAAAFnF5eAkSbVr11bt2rUzuhYAAAAAyJZuKzglJiZq1apV+vXXX2Wz2VSuXDm1adNG7u7uGV0fAAAAAGQ5l4PTH3/8oRYtWujEiRMqU6aMjDH67bffFBYWpi+++EIlSpTIjDoBAAAAIMu4PKvewIEDVaJECR07dky7du3S7t27dfToURUrVkwDBw7MjBoBAAAAIEu5fMYpOjpa27Zts089Lkn58uXTyy+/zHVPAAAAAO5JLp9x8vLy0qVLl1K0X758WZ6enhlSFAAAAABkJy4Hp1atWunpp5/W9u3bZYyRMUbbtm1Tv3791KZNm8yoEQAAAACylMvB6bXXXlOJEiVUs2ZNeXt7y9vbW7Vr11bJkiU1Z86czKgRAAAAALKUy9c45c6dW6tXr9bvv/+u/fv3yxijcuXKqWTJkplRHwAAAABkudu6j5MklSpVSqVKlcrIWgAAAAAgW3IqOA0dOtTpDc6aNeu2iwEAAACA7Mip4LR7926nNmaz2e6oGAAAAADIjpwKTps2bcrsOgAAAAAg23J5Vj0AAAAAyGkITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABggeAEAAAAABYITgAAAABgIUuDU0JCgl588UUVK1ZMPj4+Kl68uCZNmqSkpKR017t+/brGjBmj8PBweXl5qUSJEnr//ffvUtUAAAAAcppcWbnz6dOna+7cufrwww9Vvnx57dy5Uz179lRQUJAGDRqU5nqdOnXS6dOnNX/+fJUsWVJnzpxRQkLCXawcAAAAQE6SpcFp69atatu2rVq2bClJioiI0JIlS7Rz584011m/fr2io6P1559/Km/evPb10nL9+nVdv37d/jw2NlaSFB8fr/j4+Aw4CgDAv1HydwDfBQCQc7nyHZClwalOnTqaO3eufvvtN5UuXVo//vijtmzZotmzZ6e5zpo1a1S1alXNmDFDixYtkp+fn9q0aaPJkyfLx8cnRf9p06Zp4sSJKdojIyPl6+ubkYcDAPgXioqKyuoSAABZJC4uzum+WRqcRowYoYsXL6ps2bJyd3dXYmKipk6dqscffzzNdf78809t2bJF3t7eWrly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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Specify the 'x' and 'y' coordinates for the time series\n", "x_coord = 5.8711167e+05 #5.208e+05\n", "y_coord = 5.68962179e+06 #5.712e+06\n", "\n", "# x_coord = 5.208e+05\n", "# y_coord = 5.712e+06\n", "\n", "# Extract the time series at the specified 'x' and 'y' coordinates\n", "time_series = merged_data.sel(x=x_coord, y=y_coord, method='nearest')\n", "\n", "ch = time_series.values.tolist()\n", "time = time_series.time.values.tolist()\n", "time = [x / 1e9 for x in time]\n", "date_strings = [datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') for timestamp in time]\n", "\n", "plt.figure(figsize=(10, 6))\n", "plt.plot(date_strings, ch, marker='o', color='g')\n", "plt.title(f'chl_re_gons\\n log10 CHL Gons [mg m-3]\\n UTM Easting: {x_coord}, UTM Northing: {y_coord}')\n", "plt.xlabel('Time')\n", "plt.ylabel('log10 CHL Gons [mg m-3]')\n", "plt.grid(True)\n", "\n", "output_filename = folder_path + '/plot_ch.png'\n", "print(output_filename)\n", "plt.savefig(output_filename)\n", "\n", "\n", "data = pd.DataFrame({'Date': date_strings, 'CHL': ch})\n", "y_axis_limits = (0, 10)\n", "\n", "# Create an Altair chart\n", "chart = alt.Chart(data.dropna()).mark_bar(size=10).encode(\n", " x='Date:T',\n", " y='CHL:Q',\n", " # scale=alt.Scale(domain=list(y_axis_limits)),\n", " color=alt.Color(\n", " 'CHL:Q', scale=alt.Scale(scheme='redyellowgreen', domain=(5, 20))),\n", " tooltip=[\n", " alt.Tooltip('Date:T', title='Date'),\n", " alt.Tooltip('log10 CHL Gons [mg m-3]:Q', title='log10 CHL Gons [mg m-3]')\n", " ]).properties(\n", " width=600, height=400,\n", " title=f'chl_re_gons - log10 CHL Gons [mg m-3]\\n x_coord: {x_coord}, y_coord: {y_coord}'\n", ")\n", "\n", "\n", "# Display the Altair chart\n", "print(folder_path + \"/plot_ch_atl.html\")\n", "chart.save(folder_path + \"/plot_ch_atl.html\")" ] } ], "metadata": { "kernelspec": { "display_name": "coastviewer", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }