diff --git a/examples/coupled_model/config.yml b/examples/coupled_model/config.yml
index 42cd27f..16e1ed6 100644
--- a/examples/coupled_model/config.yml
+++ b/examples/coupled_model/config.yml
@@ -113,7 +113,7 @@ compute_notebooks:
# parameters are specified. Several examples of different
# types of notebooks are provided.
- # The second key (here adf_quick_run) is the name of the
+ # The second key (here ocean_surface) is the name of the
# notebook from nb_path_root, minus the .ipynb
infrastructure:
@@ -121,14 +121,6 @@ compute_notebooks:
parameter_groups:
none: {}
- atm:
- adf_quick_run:
- parameter_groups:
- none:
- adf_path: ../../../externals/ADF
- config_path: .
- config_fil_str: "config_f.cam6_3_119.FLTHIST_ne30.r328_gamma0.33_soae.001.yaml"
-
ocn:
ocean_surface:
parameter_groups:
@@ -187,13 +179,8 @@ book_toc:
# Parts group notebooks into different sections in the Jupyter book
# table of contents, so you can organize different parts of your project.
-
- - caption: Atmosphere
-
- # Each chapter is the name of one of the notebooks that you executed
- # in compute_notebooks above, also without .ipynb
- chapters:
- - file: atm/adf_quick_run
+ # Each chapter is the name of one of the notebooks that you executed
+ # in compute_notebooks above, also without .ipynb
- caption: Ocean
chapters:
diff --git a/nblibrary/atm/adf_quick_run.ipynb b/nblibrary/atm/adf_quick_run.ipynb
deleted file mode 100644
index 115369a..0000000
--- a/nblibrary/atm/adf_quick_run.ipynb
+++ /dev/null
@@ -1,1021 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "1ca2a6f5-bd5a-4520-8380-baf5cb536d41",
- "metadata": {},
- "source": [
- "## ADF Diagnostics In Jupyter\n",
- "This notebook will run the Atmospheric Diagnostic Framework using the settings in a config.yaml file in your ADF directory. \n",
- "\n",
- "Note that it was developed to run on Cheyenne/Caspar *with the NPL (conda) kernel*"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "7eea8d1a-d6a7-4464-bd6d-8194aa2368d0",
- "metadata": {
- "tags": []
- },
- "source": [
- "### Setup\n",
- "#### Required packages"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "4d0264e2-c116-4e18-af33-0ce3adabcd60",
- "metadata": {},
- "outputs": [],
- "source": [
- "import os.path\n",
- "from pathlib import Path\n",
- "import sys"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "6566766f-9d8f-4428-bf01-3c36a1ffeb63",
- "metadata": {},
- "source": [
- "#### Paths"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9e627890-a0a9-42d9-bb23-302abfedd944",
- "metadata": {},
- "outputs": [],
- "source": [
- "### default parameters\n",
- "# adf_path = \"../../externals/ADF\"\n",
- "# config_path = \".\"\n",
- "# config_fil_str = \"config_f.cam6_3_119.FLTHIST_ne30.r328_gamma0.33_soae_numcin3.001_vs_f.cam6_3_119.FLTHIST_ne30.r328_gamma0.33_soae.001.yaml\""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "5ec97fae-f7f3-40cc-adf0-3f6726753215",
- "metadata": {
- "tags": [
- "parameters"
- ]
- },
- "outputs": [],
- "source": [
- "# cell to insert parameters"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a88e305c-5473-4de6-9aa5-bf674ecd899f",
- "metadata": {},
- "source": [
- "#### All path processing:\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "66a55cfa-2d81-4298-8623-4ceaf3c0fb1f",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Determine ADF directory path\n",
- "# If it is in your cwd, set adf_path = local_path,\n",
- "# otherwise set adf_path appropriately\n",
- "\n",
- "local_path = os.path.abspath(\"\")\n",
- "\n",
- "# Set up the ADF for your location/user name\n",
- "# user = \"richling\"\n",
- "# adf_path = f\"/glade/work/{user}/ADF/\"\n",
- "\n",
- "print(f\"current working directory = {local_path}\")\n",
- "print(f\"ADF path = {adf_path}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1689b448-daf6-44ca-9c9e-b1345490b552",
- "metadata": {},
- "outputs": [],
- "source": [
- "# set path to ADF lib\n",
- "lib_path = os.path.join(adf_path, \"lib\")\n",
- "print(f\"The lib scripts live here, right? {lib_path}\")\n",
- "\n",
- "# Add paths to python path:\n",
- "sys.path.append(lib_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f927cc3e-7fa9-4347-b44e-956c7ebdc742",
- "metadata": {},
- "outputs": [],
- "source": [
- "# set path to ADF plotting scripts directory\n",
- "plotting_scripts_path = os.path.join(adf_path, \"scripts\", \"plotting\")\n",
- "print(f\"The plotting scripts live here, right? {plotting_scripts_path}\")\n",
- "\n",
- "# Add paths to python path:\n",
- "sys.path.append(plotting_scripts_path)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "159be7f2-8593-483a-b200-daf8c3c992c8",
- "metadata": {},
- "source": [
- "#### Import config file into ADF object\n",
- "If there are errors, here, it is likely due to path errors above"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "cd4918d2-dcc0-417b-8867-d368c4cb1d78",
- "metadata": {},
- "outputs": [],
- "source": [
- "config_file = os.path.join(config_path, config_fil_str)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f553607f-cd31-4aa3-8142-4959b3569a1a",
- "metadata": {},
- "outputs": [],
- "source": [
- "# import ADF diagnostics object\n",
- "from adf_diag import AdfDiag\n",
- "\n",
- "# If this fails, check your paths output in the cells above,\n",
- "# and that you are running the NPL (conda) Kernel\n",
- "# You can see all the paths being examined by un-commenting the following:\n",
- "# sys.path"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "4ac46243-f980-41e1-9f8c-8d8ad361bb89",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Initialize ADF object\n",
- "adf = AdfDiag(config_file)\n",
- "adf"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "c7d266a8-f006-468d-96d5-51d9a93dd6dd",
- "metadata": {
- "tags": []
- },
- "source": [
- "### ADF Standard Work Flow"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "1b1d075b-232d-4466-a6be-192c457ae5a9",
- "metadata": {},
- "source": [
- "#### Calculate the Time Series files\n",
- "\n",
- "* NOTE: If not comparing against observations, you must run _create_time_series()_ again with baseline flag"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "5f056e6d-5828-434d-b70b-f60627f30ba1",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# Create model time series.\n",
- "adf.create_time_series()\n",
- "\n",
- "# Create model baseline time series (if needed):\n",
- "if not adf.compare_obs:\n",
- " adf.create_time_series(baseline=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4ec72ce9-8167-435c-8334-728e2df24a01",
- "metadata": {},
- "source": [
- "#### Calculate the Climo files\n",
- "\n",
- "* NOTE: Do not need to specify or repeat for baseline case unlike time series generation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "85a611c7-a90b-4d24-a518-046407564e35",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# Create model climatology (climo) files.\n",
- "adf.create_climo()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "0dc28ffb-f501-4a42-8e21-cd8b993163ea",
- "metadata": {},
- "source": [
- "#### Regrid the Climo files"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9673eada-6eeb-4c68-b59a-bd7baf62aca1",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# Regrid model climatology files to match either\n",
- "# observations or CAM baseline climatologies.\n",
- "# This call uses the \"regridding_scripts\" specified in the config file:\n",
- "adf.regrid_climo()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "56434dfe-187d-43a8-967c-5cf027e1b05b",
- "metadata": {},
- "source": [
- "#### Run statistics on Time Series files"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e40c90be-b041-46b6-b268-3f3f02ea855a",
- "metadata": {
- "tags": []
- },
- "source": [
- "#Perform analyses on the simulation(s).\n",
- "#This call uses the \"analysis_scripts\" specified in the config file:\n",
- "adf.perform_analyses()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e12c5b56-2a54-49c9-816c-9d447d511a9d",
- "metadata": {},
- "source": [
- "#### Create Plots"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "31c8782b-1492-4260-bfea-48a69169e30a",
- "metadata": {
- "tags": []
- },
- "source": [
- "#Create plots.\n",
- "#This call uses the \"plotting_scripts\" specified in the config file:\n",
- "adf.create_plots()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "898b1090-aad9-45b2-a0f2-2882ae8f9834",
- "metadata": {},
- "source": [
- "#### Generate HTML files\n",
- "\n",
- "* This will create html files that you can view via webbrower either:\n",
- " - in Casper/Cheyenne\n",
- " - pushing it to CGD projects webpage through Tungsten"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f391772b-8f17-40bc-b87d-d9b27b0a8bba",
- "metadata": {
- "tags": []
- },
- "source": [
- "#Create website.\n",
- "if adf.create_html:\n",
- " adf.create_website()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "11d4e7cd-49f5-4a68-85a1-ad18fa2a6706",
- "metadata": {},
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "29b2605d-519c-4305-ab2b-47c5c053a00c",
- "metadata": {},
- "source": [
- "## ADF Helpful Methods and Structures \n",
- "\n",
- "Demonstration of a few methods to get information from the ADF object"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "cdd8063d-195b-42bc-99a4-37ea0f9a62a0",
- "metadata": {},
- "source": [
- "#### List all adf object related methods"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d3d9703e-5053-4a3f-9745-2a6cddfa4f6c",
- "metadata": {},
- "outputs": [],
- "source": [
- "dir(adf)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b6f3971d-14de-4d7d-996b-39e4bda99d1d",
- "metadata": {},
- "outputs": [],
- "source": [
- "adf.num_procs"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4583376e-6ac3-4f0f-81d0-f4e92ce13124",
- "metadata": {},
- "source": [
- "### Get information from the subsections of the config yaml file\n",
- "\n",
- "Remember the different sub-sections?"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ad924a19-81ba-49dc-8e3b-2bb44f2b5114",
- "metadata": {},
- "source": [
- "#### Basic Info Section"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e3904cb9-a618-43af-9605-e6fcd4e7fd59",
- "metadata": {},
- "outputs": [],
- "source": [
- "basic_info_dict = adf.read_config_var(\"diag_basic_info\")\n",
- "\n",
- "for key, val in basic_info_dict.items():\n",
- " print(f\"{key}: {val}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e8b1de2f-2a36-472f-b0ae-517845245473",
- "metadata": {},
- "source": [
- "#### Test Case Info Section"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "cccdb0b2-ba50-45d5-8ce5-af6a9161c762",
- "metadata": {},
- "outputs": [],
- "source": [
- "test_dict = adf.read_config_var(\"diag_cam_climo\")\n",
- "\n",
- "for key, val in test_dict.items():\n",
- " print(f\"{key}: {val}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "33a7da55-13a0-49a6-988b-ab7451b49dac",
- "metadata": {},
- "source": [
- "#### Baseline Case Info Section"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9cf8b802-300f-41f6-b6ad-32c4f08c463f",
- "metadata": {},
- "outputs": [],
- "source": [
- "baseline_dict = adf.read_config_var(\"diag_cam_baseline_climo\")\n",
- "\n",
- "for key, val in baseline_dict.items():\n",
- " print(f\"{key}: {val}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "b878fc07-a39a-4ef6-a04c-499280d3d6cb",
- "metadata": {},
- "source": [
- "### Get information not directly from the subsections of the config yaml file\n",
- "\n",
- "This just represents a different way to get some ADF info"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "721ba2f9-29c8-40ee-a813-181194f46b40",
- "metadata": {},
- "source": [
- "#### Get Case/Baseline Names\n",
- "\n",
- "This is a different wat to get case names than from the *adf.read_config_var()* method that read in data from sub-sections above"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "55b72978-0af4-4d04-87d6-0c56de58400b",
- "metadata": {},
- "outputs": [],
- "source": [
- "# List of case names (list by default)\n",
- "case_names = adf.get_cam_info(\"cam_case_name\", required=True)\n",
- "print(case_names)\n",
- "\n",
- "base_name = adf.get_baseline_info(\"cam_case_name\")\n",
- "print(base_name)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "898f441c-b001-4165-a614-766183b638ed",
- "metadata": {},
- "source": [
- "#### Get Case/Baseline Climo file locations\n",
- "\n",
- "Here we are calling directly from the config file, no subsection "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "77ba4bcb-70d7-47cd-a7c5-0b1827baaaf3",
- "metadata": {},
- "outputs": [],
- "source": [
- "case_climo_loc = adf.get_cam_info(\"cam_climo_loc\", required=True)\n",
- "base_climo_loc = adf.get_baseline_info(\"cam_climo_loc\")\n",
- "case_climo_loc, base_climo_loc"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "864e9b1f-fef8-4d45-94b6-5e4cc8e099c9",
- "metadata": {},
- "source": [
- "#### Get Desired Variable Names\n",
- "\n",
- "Here we are calling directly from the config file, no subsection "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ff7a34b1-6795-46f3-a3b5-a40507b6aa52",
- "metadata": {},
- "outputs": [],
- "source": [
- "var_list = adf.diag_var_list\n",
- "print(var_list)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e8504642-fcfc-482c-b5a8-7494f9fde680",
- "metadata": {},
- "source": [
- "#### Get variable defaults from adf_variable_defaults.yaml\n",
- "\n",
- "Take a look at what defaults are for TS"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a3a780fd-6234-4574-8535-ebf6e7bba3fc",
- "metadata": {},
- "outputs": [],
- "source": [
- "adf.variable_defaults[\"TS\"]"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "b2701110-87da-44be-8cc5-a67fe759870e",
- "metadata": {},
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4e847946-aed1-4226-be42-46b46fc945ea",
- "metadata": {},
- "source": [
- "## Exploration of the Output Data\n",
- "\n",
- "Now that the ADF has created all the necessary timeseries/climo/regridded data let's run a quick set of functions to plot time series for RESTOM, TS, and ICEFRAC"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "5eddc165-065b-4874-a53d-0a53486c1817",
- "metadata": {},
- "source": [
- "##### Let's grab the case names, time series locations, variable defaults dictionary and climo years"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "001f31de-2897-4cfd-a7a2-a63a47b63827",
- "metadata": {},
- "outputs": [],
- "source": [
- "case_names = adf.get_cam_info(\"cam_case_name\", required=True)\n",
- "case_names_len = len(case_names)\n",
- "data_name = adf.get_baseline_info(\"cam_case_name\", required=False)\n",
- "\n",
- "case_ts_locs = adf.get_cam_info(\"cam_ts_loc\", required=True)\n",
- "data_ts_loc = adf.get_baseline_info(\"cam_ts_loc\", required=False)\n",
- "\n",
- "res = adf.variable_defaults # dict of variable-specific plot preferences\n",
- "# or an empty dictionary if use_defaults was not specified in YAML.\n",
- "\n",
- "start_year = adf.climo_yrs[\"syears\"]\n",
- "end_year = adf.climo_yrs[\"eyears\"]"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "40e35c52-2044-4677-8b7c-d8266bd19b20",
- "metadata": {},
- "source": [
- "### Time Series Plotting Functions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a123c21a-e27b-4b2b-b674-c77b7912d996",
- "metadata": {},
- "outputs": [],
- "source": [
- "def _load_dataset(fils):\n",
- " if len(fils) == 0:\n",
- " print(\"Input file list is empty.\")\n",
- " return None\n",
- " elif len(fils) > 1:\n",
- " return xr.open_mfdataset(fils, combine=\"by_coords\")\n",
- " else:\n",
- " sfil = str(fils[0])\n",
- " return xr.open_dataset(sfil)\n",
- " # End if\n",
- "\n",
- "\n",
- "# End def"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "eff599aa-4ad7-43b0-8381-a94177e40c6e",
- "metadata": {},
- "outputs": [],
- "source": [
- "def _data_calcs(ts_loc, var, subset=None):\n",
- " \"\"\"\n",
- " args\n",
- " ----\n",
- " - ts_loc: Path\n",
- " path to time series file\n",
- "\n",
- " - var: str\n",
- " name of variable\n",
- "\n",
- " - subset (optional): dict\n",
- " lat/lon extents (south, north, east, west)\n",
- " \"\"\"\n",
- " fils = sorted(list(Path(ts_loc).glob(f\"*{var}*.nc\")))\n",
- "\n",
- " ts_ds = _load_dataset(fils)\n",
- "\n",
- " time = ts_ds[\"time\"]\n",
- " time = xr.DataArray(\n",
- " ts_ds[\"time_bnds\"].load().mean(dim=\"nbnd\").values,\n",
- " dims=time.dims,\n",
- " attrs=time.attrs,\n",
- " )\n",
- " ts_ds[\"time\"] = time\n",
- " ts_ds.assign_coords(time=time)\n",
- " ts_ds = xr.decode_cf(ts_ds)\n",
- "\n",
- " if subset != None:\n",
- " ts_ds = ts_ds.sel(\n",
- " lat=slice(subset[\"s\"], subset[\"n\"]), lon=slice(subset[\"w\"], subset[\"e\"])\n",
- " )\n",
- "\n",
- " data = ts_ds[var].squeeze()\n",
- " unit = data.units\n",
- "\n",
- " # global weighting\n",
- " w = np.cos(np.radians(data.lat))\n",
- " avg = data.weighted(w).mean(dim=(\"lat\", \"lon\"))\n",
- "\n",
- " yrs = np.unique(\n",
- " [\n",
- " str(val.item().timetuple().tm_year).zfill(4)\n",
- " for _, val in enumerate(ts_ds[\"time\"])\n",
- " ]\n",
- " )\n",
- "\n",
- " return avg, yrs, unit"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8141a995-7a66-4562-9ea6-472cde4e21f2",
- "metadata": {},
- "outputs": [],
- "source": [
- "def ts_plot(ax, name, vals, yrs, unit, color_dict, linewidth=None, zorder=1):\n",
- " \"\"\"\n",
- " args\n",
- " ----\n",
- " - color_dict: dict\n",
- " color and marker style for variable\n",
- " \"\"\"\n",
- "\n",
- " ax.plot(\n",
- " yrs,\n",
- " vals,\n",
- " color_dict[\"marker\"],\n",
- " c=color_dict[\"color\"],\n",
- " label=name,\n",
- " linewidth=linewidth,\n",
- " zorder=zorder,\n",
- " )\n",
- "\n",
- " ax.set_xlabel(\"Years\", fontsize=15, labelpad=20)\n",
- " ax.set_ylabel(unit, fontsize=15, labelpad=20)\n",
- "\n",
- " # For the minor ticks, use no labels; default NullFormatter.\n",
- " ax.tick_params(which=\"major\", length=7)\n",
- " ax.tick_params(which=\"minor\", length=5)\n",
- "\n",
- " return ax"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d7aaeed2-b21f-4610-8b2e-0530d5556b69",
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_var_details(ax, var, vals_cases, vals_base):\n",
- " mins = []\n",
- " maxs = []\n",
- " for i, val in enumerate(vals_cases):\n",
- " mins.append(np.nanmin(vals_cases[i]))\n",
- " maxs.append(np.nanmax(vals_cases[i]))\n",
- "\n",
- " mins.append(np.nanmin(vals_base))\n",
- " maxs.append(np.nanmax(vals_base))\n",
- "\n",
- " if var == \"SST\":\n",
- " ax.set_ylabel(\"K\", fontsize=20, labelpad=12)\n",
- " tick_spacing = 0.5\n",
- " ax.yaxis.set_major_locator(MultipleLocator(1))\n",
- " ax.set_title(f\"Time Series Global: {var} - ANN\", loc=\"left\", fontsize=22)\n",
- "\n",
- " if var == \"TS\":\n",
- " ax.set_ylabel(\"K\", fontsize=20, labelpad=12)\n",
- " tick_spacing = 0.5\n",
- " ax.yaxis.set_minor_locator(MultipleLocator(0.5))\n",
- " ax.set_title(f\"Time Series Global: {var} - ANN\", loc=\"left\", fontsize=22)\n",
- "\n",
- " if var == \"ICEFRAC\":\n",
- " ax.set_ylabel(\"frac\", fontsize=20, labelpad=12)\n",
- " tick_spacing = 0.1\n",
- " ax.set_ylim(np.floor(min(mins)), np.ceil(max(maxs)))\n",
- " ax.set_title(f\"Time Series LabSea: {var} - ANN\", loc=\"left\", fontsize=22)\n",
- "\n",
- " if var == \"RESTOM\":\n",
- " ax.set_ylabel(\"W/m2\", fontsize=20, labelpad=12)\n",
- " tick_spacing = 0.5\n",
- " ax.yaxis.set_minor_locator(MultipleLocator(0.1))\n",
- " ax.set_title(f\"Time Series Global: {var} - ANN\", loc=\"left\", fontsize=22)\n",
- "\n",
- " # Set label to show if RESTOM is 1 or 5-yr avg\n",
- " line_1yr = Line2D(\n",
- " [],\n",
- " [],\n",
- " label=\"1-yr avg\",\n",
- " color=\"k\",\n",
- " linewidth=1,\n",
- " marker=\"*\",\n",
- " )\n",
- " line_5yr = Line2D(\n",
- " [],\n",
- " [],\n",
- " label=\"5-yr avg\",\n",
- " color=\"k\",\n",
- " linewidth=1,\n",
- " )\n",
- " ax.legend(handles=[line_1yr, line_5yr], bbox_to_anchor=(0.99, 0.99))\n",
- "\n",
- " # Add extra space on the y-axis, except for ICEFRAC\n",
- " if var != \"ICEFRAC\":\n",
- " ax.set_ylim(np.floor(min(mins)), np.ceil(max(maxs)) + tick_spacing)\n",
- "\n",
- " ax.yaxis.set_major_locator(MultipleLocator(tick_spacing))\n",
- "\n",
- " ax.tick_params(axis=\"y\", which=\"major\", labelsize=16)\n",
- " ax.tick_params(axis=\"y\", which=\"minor\", labelsize=16)\n",
- "\n",
- " ax.tick_params(axis=\"x\", which=\"major\", labelsize=14)\n",
- " ax.tick_params(axis=\"x\", which=\"minor\", labelsize=14)\n",
- "\n",
- " return ax"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "26eb6dfb-eec3-4c89-9964-6495891ca572",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "1fa7a0d8-6d8f-45e1-b606-9507a11764dc",
- "metadata": {},
- "source": [
- "### Plot the time series!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "67e22347-a3b8-4b3c-a68f-38a84ff58454",
- "metadata": {},
- "outputs": [],
- "source": [
- "ts_var_list = [\"RESTOM\", \"TS\", \"ICEFRAC\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "90848bf6-403d-4a3b-a69a-b4ff12f3891b",
- "metadata": {},
- "outputs": [],
- "source": [
- "%matplotlib inline\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import xarray as xr\n",
- "import numpy as np\n",
- "from matplotlib.ticker import MultipleLocator\n",
- "from matplotlib.lines import Line2D\n",
- "\n",
- "fig = plt.figure(figsize=(30, 15))\n",
- "\n",
- "# Change the layout/number of subplots based off number of variables desired\n",
- "rows = 2\n",
- "cols = 3\n",
- "gs = fig.add_gridspec(rows, cols, hspace=0.3, wspace=0.2)\n",
- "\n",
- "# Rough subset for Lab Sea\n",
- "w = -63.5 + 360\n",
- "e = -47.5 + 360\n",
- "s = 53.5\n",
- "n = 65.5\n",
- "subset = {\"s\": s, \"n\": n, \"e\": e, \"w\": w}\n",
- "\n",
- "# Add more colors as needed for number of test cases\n",
- "# ** Baseline is already added as green dashed line in plotting function **\n",
- "# matplotlib colors here: https://matplotlib.org/stable/gallery/color/named_colors.html\n",
- "colors = [\"k\", \"aqua\", \"orange\", \"b\", \"magenta\", \"goldenrod\", \"slategrey\", \"rosybrown\"]\n",
- "\n",
- "# Setup plotting\n",
- "# ---------------\n",
- "\n",
- "# Loop over variables:\n",
- "for i, var in enumerate(ts_var_list):\n",
- " print(\"Plotting variable:\", var)\n",
- "\n",
- " if var == \"RESTOM\":\n",
- " ax = plt.subplot(gs[0, 0])\n",
- " if var == \"TS\":\n",
- " ax = plt.subplot(gs[0, 1])\n",
- " if var == \"ICEFRAC\":\n",
- " ax = plt.subplot(gs[0, 2])\n",
- "\n",
- " # Grab baseline case:\n",
- " # --------------------\n",
- "\n",
- " if var == \"RESTOM\":\n",
- " avg_base_FSNT, yrs_base, unit = _data_calcs(data_ts_loc, \"FSNT\")\n",
- " avg_base_FLNT, _, _ = _data_calcs(data_ts_loc, \"FLNT\")\n",
- " if len(yrs_base) < 5:\n",
- " print(\n",
- " f\"Not a lot of climo years for {data_name}, only doing 1-yr avg for RESTOM...\"\n",
- " )\n",
- " FSNT_base = avg_base_FSNT\n",
- " FLNT_base = avg_base_FLNT\n",
- " else:\n",
- " FSNT_base = avg_base_FSNT.rolling(time=60, center=True).mean()\n",
- " FLNT_base = avg_base_FLNT.rolling(time=60, center=True).mean()\n",
- "\n",
- " avg_base = FSNT_base - FLNT_base\n",
- "\n",
- " if var == \"TS\" or var == \"SST\":\n",
- " avg_base, yrs_base, unit = _data_calcs(data_ts_loc, var)\n",
- "\n",
- " if var == \"ICEFRAC\":\n",
- " avg_base, yrs_base, unit = _data_calcs(data_ts_loc, var, subset)\n",
- "\n",
- " # Get int of years for plotting on x-axis\n",
- " yrs_base_int = yrs_base.astype(int)\n",
- "\n",
- " # Create yearly averages\n",
- " vals_base = [avg_base.sel(time=i).mean() for i in yrs_base]\n",
- "\n",
- " # Plot baseline data\n",
- " color_dict = {\"color\": \"g\", \"marker\": \"--\"}\n",
- " ax = ts_plot(ax, data_name, vals_base, yrs_base_int, unit, color_dict)\n",
- "\n",
- " # Loop over test cases:\n",
- " # ----------------------\n",
- " # Create lists to hold all sets of years (for each case) and\n",
- " # sets of var data (for each case)\n",
- " vals_cases = []\n",
- " yrs_cases = []\n",
- " for case_idx, case_name in enumerate(case_names):\n",
- " if var == \"RESTOM\":\n",
- " avg_case_FSNT, yrs_case, unit = _data_calcs(case_ts_locs[case_idx], \"FSNT\")\n",
- " avg_case_FLNT, _, _ = _data_calcs(case_ts_locs[case_idx], \"FLNT\")\n",
- " if len(yrs_case) < 5:\n",
- " print(\n",
- " f\"Not a lot of climo years for {case_name}, only doing 1-yr avg for RESTOM...\"\n",
- " )\n",
- " FSNT_case = avg_case_FSNT\n",
- " FLNT_case = avg_case_FLNT\n",
- " color_dict = {\"color\": colors[case_idx], \"marker\": \"-*\"}\n",
- " else:\n",
- " FSNT_case = avg_case_FSNT.rolling(time=60, center=True).mean()\n",
- " FLNT_case = avg_case_FLNT.rolling(time=60, center=True).mean()\n",
- " color_dict = {\"color\": colors[case_idx], \"marker\": \"-\"}\n",
- "\n",
- " avg_case = FSNT_case - FLNT_case\n",
- "\n",
- " if var == \"TS\":\n",
- " avg_case, yrs_case, unit = _data_calcs(case_ts_locs[case_idx], var)\n",
- " color_dict = {\"color\": colors[case_idx], \"marker\": \"-\"}\n",
- "\n",
- " if var == \"ICEFRAC\":\n",
- " avg_case, yrs_case, unit = _data_calcs(case_ts_locs[case_idx], var, subset)\n",
- " color_dict = {\"color\": colors[case_idx], \"marker\": \"-\"}\n",
- "\n",
- " # Get yearly averages for all available years\n",
- " vals_case = [avg_case.sel(time=i).mean() for i in yrs_case]\n",
- " vals_cases.append(vals_case)\n",
- "\n",
- " # Get int of years for plotting on x-axis\n",
- " yrs_case_int = yrs_case.astype(int)\n",
- " yrs_cases.append(yrs_case_int)\n",
- "\n",
- " # Add case to plot (ax)\n",
- " ax = ts_plot(ax, case_name, vals_case, yrs_case_int, unit, color_dict)\n",
- "\n",
- " # End for (case names)\n",
- "\n",
- " # Get variable details\n",
- " ax = plot_var_details(ax, var, vals_cases, vals_base)\n",
- "\n",
- " # Grab all unique years and find min/max years\n",
- " uniq_yrs = sorted(x for v in yrs_cases for x in v)\n",
- " max_year = int(max(uniq_yrs))\n",
- " min_year = int(min(uniq_yrs))\n",
- "\n",
- " last_year = max_year - max_year % 5\n",
- " if (max_year > 5) and (last_year < max_year):\n",
- " last_year += 5\n",
- "\n",
- " first_year = min_year - min_year % 5\n",
- " if min_year < 5:\n",
- " first_year = 0\n",
- "\n",
- " ax.set_xlim(first_year, last_year)\n",
- " ax.set_xlabel(\"Years\", fontsize=15, labelpad=20)\n",
- " # Set the x-axis plot limits\n",
- " # to guarantee data from all cases (including baseline) are on plot\n",
- " ax.set_xlim(min_year, max_year + 1)\n",
- "\n",
- " # x-axis ticks and numbers\n",
- " if max_year - min_year > 120:\n",
- " ax.xaxis.set_major_locator(MultipleLocator(20))\n",
- " ax.xaxis.set_minor_locator(MultipleLocator(10))\n",
- " if 10 <= max_year - min_year <= 120:\n",
- " ax.xaxis.set_major_locator(MultipleLocator(5))\n",
- " ax.xaxis.set_minor_locator(MultipleLocator(1))\n",
- " if 0 < max_year - min_year < 10:\n",
- " ax.xaxis.set_major_locator(MultipleLocator(1))\n",
- " ax.xaxis.set_minor_locator(MultipleLocator(1))\n",
- "\n",
- " # End for (case loop)\n",
- "# End for (variables loop)\n",
- "\n",
- "# Set up legend\n",
- "# Gather labels based on case names and plotted line format (color, style, etc)\n",
- "lines_labels = [ax.get_legend_handles_labels() for ax in fig.axes]\n",
- "lines, labels = [sum(lol, []) for lol in zip(*lines_labels)]\n",
- "fig.legend(\n",
- " lines[: case_names_len + 1],\n",
- " labels[: case_names_len + 1],\n",
- " loc=\"center left\",\n",
- " fontsize=18,\n",
- " bbox_to_anchor=(0.365, 0.4, 0.02, 0.05),\n",
- ") # bbox_to_anchor(x0, y0, width, height)\n",
- "\n",
- "fig.show()\n",
- "\n",
- "# plt.savefig(\"TimeSeries_ANN.png\", facecolor='w',bbox_inches=\"tight\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "7b037d2f-85c0-4849-a8f1-f4a18d3ddc31",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "NPL 2023a",
- "language": "python",
- "name": "npl-2023a"
- },
- "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.9.16"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}