{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Baseline Surface Radiation Network (BSRN)\n", "\n", "The [Baseline Surface Radiation Network (BSRN)](https://bsrn.awi.de/) is a global network of high-quality solar radiation monitoring stations under the [World Climate Research Programme (WCRP)](https://www.wcrp-climate.org/) {cite:p}`driemel_baseline_2018`. The procedures of the BSRN are described in great detail in the [BSRN Operations Manual\n", "Version 2.1](https://bsrn.awi.de/fileadmin/user_upload/bsrn.awi.de/Publications/McArthur.pdf).\n", "\n", "According to the [World Radiation Monitoring Center (WRMC)](https://bsrn.awi.de/project/objectives/):\n", "> The data [from the BSRN stations] are of primary importance in supporting the validation and confirmation of satellite and computer model estimates of these quantities. At a small number of stations (currently 74 in total, 58 active) in contrasting climatic zones, covering a latitude range from 80°N to 90°S, solar and atmospheric radiation is measured with instruments of the highest available accuracy and with high time resolution.\n", "\n", "A list of active, inactive, and candidate BSRN stations can be retrieved from the SolarStations [station catalog](../station_catalog) and are shown on the map below." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "remove-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
Station full nameAbbreviationStateCountryLatitudeLongitudeElevationTime periodNetworkOwnerCommentData availabilityTierInstrumentComponents
Loading... (need help?)
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "from itables import init_notebook_mode, show\n", "init_notebook_mode(all_interactive=True)\n", "\n", "stations = pd.read_csv('../solarstations.csv').fillna('')\n", "stations = stations[stations['Network'].str.contains('BSRN')]\n", "del stations['URL'] # Remove the URL column to avoid cluttering the site\n", "show(stations, scrollY=\"200px\", scrollX=True, scrollCollapse=True, paging=False, classes=\"display\", order=[[0, \"asc\"]],\n", " showIndex=False, columnDefs=[{\"className\": \"dt-left\", \"targets\": \"_all\"}])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "remove-input" ] }, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import folium\n", "from folium import plugins\n", "import folium_legend\n", "\n", "EsriImagery = \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}\"\n", "EsriAttribution = \"Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community\"\n", "\n", "# Create Folium map\n", "m = folium.Map(\n", " location=[0, 15],\n", " zoom_start=1, min_zoom=1, max_bounds=True,\n", " control_scale=True, # Adds distance scale in lower left corner\n", " tiles='openstreetmap',\n", ")\n", "\n", "def station_status(time_period):\n", " if time_period.endswith('-'):\n", " return 'Active'\n", " color = '#008000' # Green for active stations\n", " elif (time_period == '') | time_period.endswith('?'):\n", " return 'Unknown'\n", " else:\n", " return 'Inactive'\n", "\n", "stations['Status'] = stations['Time period'].map(station_status)\n", "\n", "status_dict = {\n", " 'Active': '#008000', # Green for active stations\n", " 'Unknown': '#3186cc', # Blue for stations with unknown status\n", " 'Inactive': '#ff422b', # Red for inactive stations\n", "}\n", "\n", "stations['Color'] = stations['Status'].map(status_dict)\n", "\n", "# Add each station to the map\n", "for index, row in stations.iterrows():\n", " folium.CircleMarker(\n", " location=[row['Latitude'], row['Longitude']],\n", " popup=row['Station full name'] + ' - ' + str(row['State']) + ' ' + row['Country'],\n", " tooltip=row['Abbreviation'],\n", " radius=5, color=row['Color'],\n", " fill_color=row['Color'], fill=True).add_to(m)\n", "\n", "folium.raster_layers.TileLayer(EsriImagery, name='World imagery', attr=EsriAttribution, show=False).add_to(m)\n", "folium.LayerControl(position='topright').add_to(m)\n", "\n", "# Additional options and plugins\n", "# Note it's not possible to change the position of the scale\n", "#plugins.MiniMap(toggle_display=True, zoom_level_fixed=3, minimized=True, position='bottomright').add_to(m) # Add minimap to the map\n", "plugins.Fullscreen(position='bottomright').add_to(m) # Add full screen button to map\n", "folium.LatLngPopup().add_to(m) # Show latitude/longitude when clicking on the map\n", "# plugins.LocateControl(position='topright').add_to(m) # Add button for your position\n", "# plugins.MeasureControl(position='topleft').add_to(m) # Add distance length measurement tool\n", "\n", "# Create legend\n", "legend = folium_legend.make_legend(status_dict.keys(), status_dict.values(), title=\"Station status\")\n", "m.get_root().html.add_child(legend) # Add Legend to map\n", "\n", "# Show the map\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Station requirements\n", "All BSRN stations are required to meet the basic [station requirements](http://bsrn.awi.de/en/stations/join-bsrn/), which include measuring direct normal (DNI), diffuse horizontal (DHI), global horizontal (GHI), and down-welling long-wave irradiance.\n", "\n", "Additional metadata may be found at the [BSRN website](https://wiki.pangaea.de/wiki/BSRN#Sortable_Table_of_Stations) and in the individual data files (e.g., horizon profile)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{note}\n", "Unlike most solar radiation monitoring networks, the BSRN website does not have a subpage for each station (with photos, etc.). This would have been very useful when assessing the usage of the station, for example, in regards to the potential impact of nearby structures, etc. Note a few photos of the BSRN stations can be found [here](https://bsrn.awi.de/other/picture-gallery/). The station logbooks are also not available.\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It should be noted that many of the BSRN stations are also part of national station networks. For example, the Southern Great Plains and the Eastern North Atlantic sites are part of the [ARM program](https://www.arm.gov/) under the US Department of Energy. Similarly, all of the stations in the [SURFRAD network](https://gml.noaa.gov/grad/surfrad/) all part of the BSRN." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data quality\n", "\n", "It should be noted that BSRN stations do not receive specific funding but rely on national funding (e.g., meteorological institutes or research organizations) which represents a serious challenge when making long-term measurements. While the instrumentation used at BSRN stations represents the state-of-the-art, quality procedures and maintenance practices vary greatly, and consequently data quality. For example, the Cabauw (CAB) station is a station with a generally very high data quality partly owing to station inspections each work day. In contrast, data from the Brasilia (BRB), Gandhinagar (GAN), and Gurgaon (GUR) stations have been found to have periods with low data quality. In short, any kind of irradiance measurements should not be used without meticulous inspection by the data user." ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Data retrieval\n", "\n", "Data from the BSRN stations are stored in monthly files for each station and can be freely downloaded either via [FTP](https://bsrn.awi.de/?id=387) or from the [Pangea](https://bsrn.awi.de/data/data-retrieval-via-pangaea/) data portal. The data on the FTP server is identical to the data on Pangea. Credentials for accessing the BSRN FTP server can be obtained as described in the [data release guidelines](https://bsrn.awi.de/data/conditions-of-data-release). All of the files on the FTP server are in the rather archaic station-to-archive file format, which is described in the [Update of the Technical Plan for BSRN data management](https://bsrn.awi.de/fileadmin/user_upload/bsrn.awi.de/Publications/Hegner.pdf). There is no standard for when data becomes available, which can vary between a few months to more than a year.\n", "\n", "```{admonition} Data release guidelines\n", "Please read the [BSRN data release guidelines](https://bsrn.awi.de/data/conditions-of-data-release/) before using any data and make sure to properly cite the BSRN.\n", "```\n", "\n", "```{warning}\n", "WRMC highly recommends that all users do their own quality checks of the data after extracting BSRN-data!\n", "```\n", "\n", "The station-to-archive files can be parsed and downloaded using the [pvlib-python](https://pvlib-python.readthedocs.io) library, specifically the [`get_bsrn`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_bsrn.html) function. An example of how to use pvlib to download two months of data from the Cabauw (CAB) station is shown below:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import os\n", "bsrn_username = os.environ.get(\"BSRN_FTP_USERNAME\")\n", "bsrn_password = os.environ.get(\"BSRN_FTP_PASSWORD\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin} Available parameters\n", "Click the \"Click to show\" button to see the first 12 data entries.\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\arajen\\Anaconda3\\envs\\solarstations\\lib\\site-packages\\scipy\\__init__.py:146: UserWarning: A NumPy version >=1.17.3 and <1.25.0 is required for this version of SciPy (detected version 1.26.3\n", " warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n" ] }, { "ename": "error_perm", "evalue": "530 Login incorrect.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31merror_perm\u001b[0m Traceback (most recent call last)", "Input \u001b[1;32mIn [4]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpvlib\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m df, meta \u001b[38;5;241m=\u001b[39m \u001b[43mpvlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miotools\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_bsrn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mstation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mCAB\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# three letter code for the Cabauw station\u001b[39;49;00m\n\u001b[0;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTimestamp\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m2018\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m6\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mend\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTimestamp\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m2018\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m7\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m14\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43musername\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbsrn_username\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# replace with your own username\u001b[39;49;00m\n\u001b[0;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbsrn_password\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# replace with your own password\u001b[39;49;00m\n\u001b[0;32m 9\u001b[0m \u001b[43m)\u001b[49m\n\u001b[0;32m 11\u001b[0m show(df\u001b[38;5;241m.\u001b[39mhead(), scrollX\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, scrollCollapse\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, paging\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, maxColumns\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m100\u001b[39m, dom\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtpr\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[1;32m~\\Anaconda3\\envs\\solarstations\\lib\\site-packages\\pvlib\\iotools\\bsrn.py:167\u001b[0m, in \u001b[0;36mget_bsrn\u001b[1;34m(station, start, end, username, password, logical_records, save_path)\u001b[0m\n\u001b[0;32m 162\u001b[0m filenames \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mdate_range(\n\u001b[0;32m 163\u001b[0m start, end\u001b[38;5;241m.\u001b[39mreplace(day\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m+\u001b[39m pd\u001b[38;5;241m.\u001b[39mDateOffset(months\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m), freq\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m1M\u001b[39m\u001b[38;5;124m'\u001b[39m)\\\n\u001b[0;32m 164\u001b[0m \u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mstation\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m%m%y.dat.gz\u001b[39m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mtolist()\n\u001b[0;32m 166\u001b[0m \u001b[38;5;66;03m# Create FTP connection\u001b[39;00m\n\u001b[1;32m--> 167\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mftplib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mFTP\u001b[49m\u001b[43m(\u001b[49m\u001b[43mBSRN_FTP_URL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43musername\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ftp:\n\u001b[0;32m 168\u001b[0m \u001b[38;5;66;03m# Change to station sub-directory (checks that the station exists)\u001b[39;00m\n\u001b[0;32m 169\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 170\u001b[0m ftp\u001b[38;5;241m.\u001b[39mcwd(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mstation\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n", "File \u001b[1;32m~\\Anaconda3\\envs\\solarstations\\lib\\ftplib.py:123\u001b[0m, in \u001b[0;36mFTP.__init__\u001b[1;34m(self, host, user, passwd, acct, timeout, source_address, encoding)\u001b[0m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconnect(host)\n\u001b[0;32m 122\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m user:\n\u001b[1;32m--> 123\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlogin\u001b[49m\u001b[43m(\u001b[49m\u001b[43muser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpasswd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43macct\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32m~\\Anaconda3\\envs\\solarstations\\lib\\ftplib.py:414\u001b[0m, in \u001b[0;36mFTP.login\u001b[1;34m(self, user, passwd, acct)\u001b[0m\n\u001b[0;32m 412\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msendcmd(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUSER \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39m user)\n\u001b[0;32m 413\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m resp[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m3\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m--> 414\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msendcmd\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mPASS \u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mpasswd\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 415\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m resp[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m3\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 416\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msendcmd(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mACCT \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39m acct)\n", "File \u001b[1;32m~\\Anaconda3\\envs\\solarstations\\lib\\ftplib.py:281\u001b[0m, in \u001b[0;36mFTP.sendcmd\u001b[1;34m(self, cmd)\u001b[0m\n\u001b[0;32m 279\u001b[0m \u001b[38;5;124;03m'''Send a command and return the response.'''\u001b[39;00m\n\u001b[0;32m 280\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mputcmd(cmd)\n\u001b[1;32m--> 281\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresp\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32m~\\Anaconda3\\envs\\solarstations\\lib\\ftplib.py:254\u001b[0m, in \u001b[0;36mFTP.getresp\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 252\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_temp(resp)\n\u001b[0;32m 253\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m c \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m5\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m--> 254\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_perm(resp)\n\u001b[0;32m 255\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_proto(resp)\n", "\u001b[1;31merror_perm\u001b[0m: 530 Login incorrect." ] } ], "source": [ "import pvlib\n", "\n", "df, meta = pvlib.iotools.get_bsrn(\n", " station='CAB', # three letter code for the Cabauw station\n", " start=pd.Timestamp(2018,6,1),\n", " end=pd.Timestamp(2018,7,14),\n", " username=bsrn_username, # replace with your own username\n", " password=bsrn_password, # replace with your own password\n", ")\n", "\n", "show(df.head(), scrollX=True, scrollCollapse=True, paging=False, maxColumns=100, dom=\"tpr\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a description of the input parameters, see the [pvlib documentation](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_bsrn.html).\n", "\n", "```{admonition} Retrieving BSRN data in R\n", ":class: dropdown\n", "R users can find similar functionality in the [SolarData](https://github.com/dazhiyang/SolarData) R package.\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data retrieved from all BSRN stations includes measurements of the three irradiance components, as well as longwave downwelling irradiance, temperature, and humidity.\n", "\n", "A few of the parameters in the retrieved dataset are visualized below:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "axes = df[['ghi','dni','dhi','lwd','temp_air']].plot(\n", " subplots=True, legend=False, rot=0, figsize=(8,8), sharex=True)\n", "\n", "# Set y-labels and y-limits\n", "axes[0].set_ylabel('GHI [W/m$^2$]'), axes[0].set_ylim(-10,1300)\n", "axes[1].set_ylabel('DNI [W/m$^2$]'), axes[1].set_ylim(-10,1300)\n", "axes[2].set_ylabel('DHI [W/m$^2$]'), axes[2].set_ylim(-10,1300)\n", "axes[3].set_ylabel('LWD [W/m$^2$]'), axes[4].set_ylim(200,500)\n", "_ = axes[4].set_ylabel('Temperature [°]'), axes[4].set_ylim(0,40)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how there are multiple periods where there is gaps in the irradiance data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# References\n", "\n", "```{bibliography}\n", ":filter: docname in docnames\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.4" } }, "nbformat": 4, "nbformat_minor": 4 }