ESIMERKKI: Ilmakehäluotaukset#
Ilmakehää tutkitaan jatkuvasti monipuolisilla koelaitteistoilla ympäri maapalloa. Tässä esimerkissä vilkaistaan millaista jatkuvasti päivittyvää aineistoa Ilmatieteen laitoksen havaintopalloilta saadaan näkyviin.
1. Aineisto#
# Asennetaan fmiopendata-paketti (https://github.com/pnuu/fmiopendata)
!pip install fmiopendata
from fmiopendata.wfs import download_stored_query
# Ladataan luotaukset fmiopendata-paketin avulla
snd = download_stored_query("fmi::observations::weather::sounding::multipointcoverage")
Collecting fmiopendata
Downloading fmiopendata-0.4.3.tar.gz (26 kB)
Preparing metadata (setup.py) ... ?25l-
done
?25hRequirement already satisfied: numpy in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from fmiopendata) (1.24.4)
Requirement already satisfied: requests in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from fmiopendata) (2.32.3)
Collecting defusedxml (from fmiopendata)
Downloading defusedxml-0.7.1-py2.py3-none-any.whl.metadata (32 kB)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from requests->fmiopendata) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from requests->fmiopendata) (3.8)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from requests->fmiopendata) (2.2.2)
Requirement already satisfied: certifi>=2017.4.17 in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from requests->fmiopendata) (2024.8.30)
Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 kB)
Building wheels for collected packages: fmiopendata
Building wheel for fmiopendata (setup.py) ... ?25l-
done
?25h Created wheel for fmiopendata: filename=fmiopendata-0.4.3-py3-none-any.whl size=30876 sha256=6d687a77c76f5052ccddf7bee4870f39605ca389ccc65de1a858bc71f471506b
Stored in directory: /home/runner/.cache/pip/wheels/c8/14/9e/30a8716d487f942204ab3ab191310372ffd7a08b8aab4831be
Successfully built fmiopendata
Installing collected packages: defusedxml, fmiopendata
Successfully installed defusedxml-0.7.1 fmiopendata-0.4.3
# Tuodaan tarvittavat työkalukirjastot
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
2. Kuvaajien teko#
# Otetaan ensimmäinen luotaus, joka löytyy listasta.
sounding0 = snd.soundings[0]
# Laitetaan paineet ja muut parametrit taulukoihin.
paine0 = sounding0.pressures
lampotila0 = sounding0.temperatures
kastepiste0 = sounding0.dew_points
alkuaika0 = sounding0.start_time
loppuaika0 = sounding0.end_time
nimi0 = sounding0.name
aika0 = sounding0.nominal_time
korkeus0 = sounding0.altitudes
# Tarkistetaan nopeasti montako riviä havaintoja valitussa luotauksessa on.
len(paine0)
3241
# Piirretään kuvaaja
fig, ax = plt.subplots(figsize = (10, 10)) # Kuvaajan koko
# Ensimmäinen käyrä
color = "blue"
ax.set_xlabel("Lämpötila (°C)", fontsize = 15)
ax.set_ylabel("Paine (hPa)", c = color, fontsize = 15)
ax.plot(lampotila0, paine0, label = "Lämpötila", c = color) # Piirretään (T, p)
ax.plot(kastepiste0, paine0, label = "Kastepiste", c = "cyan") # Piirretään (Td, p)
ax.tick_params(axis = "y", labelcolor = color)
# Käännetään skaala ja luodaan toinen y-akseli (myös ax.set_ylim(alaraja, yläraja) toimii)
ax.set_ylim(ax.get_ylim()[::-1])
ax2 = ax.twinx()
# Toinen käyrä
color = "red"
ax2.set_ylabel("Korkeus (m)", c = color, fontsize = 15)
ax2.plot(lampotila0, korkeus0, label = "Korkeus", c = color)
ax2.tick_params(axis = "y", labelcolor = color)
# Piirretään taustaristikko
ax.set_axisbelow(True)
ax.yaxis.grid(color = 'gray', linestyle = 'dashed')
ax.xaxis.grid(color = 'gray', linestyle = 'dashed')
# Nimetään kuvaaja: Paikkakunta muuttujasta, aika muuttujasta (päivämäärä ja kellonaika)
ax.set_title(nimi0 + " " + aika0.strftime("%d.%m.%Y, %H:%M") + " UTC \n", fontsize = 20)
# Piirretään selite
plt.figlegend(bbox_to_anchor = (1.20, 0.5), fontsize = 15)
plt.show()
# Otetaan toinen luotaus, joka löytyy listasta
sounding1 = snd.soundings[1]
# Laitetaan paineet ja muut parametrit taulukoihin
paine1 = sounding1.pressures
lampotila1 = sounding1.temperatures
kastepiste1 = sounding1.dew_points
alkuaika1 = sounding1.start_time
loppuaika1 = sounding1.end_time
nimi1 = sounding1.name
aika1 = sounding1.nominal_time
korkeus1 = sounding1.altitudes
# Tarkistetaan jälleen havaintojen määrä
len(paine1)
3478
# Piirretään kuvaaja
fig, ax = plt.subplots(figsize = (10, 10)) # Kuvaajan koko
# Ensimmäinen käyrä
color = "blue"
ax.set_xlabel("Lämpötila (°C)", fontsize = 15)
ax.set_ylabel("Paine (hPa)", c = color, fontsize = 15)
ax.plot(lampotila1, paine1, label = "Lämpötila", c = color) # Piirretään (T, p)
ax.plot(kastepiste1, paine1, label = "Kastepiste", c = "cyan") # Piirretään (Td, p)
ax.tick_params(axis = "y", labelcolor = color)
# Käännetään skaala ja luodaan toinen y-akseli
ax.set_ylim(ax.get_ylim()[::-1])
ax2 = ax.twinx()
# Toinen käyrä
color = "red"
ax2.set_ylabel("Korkeus (m)", c = color, fontsize = 15)
ax2.plot(lampotila1, korkeus1, label = "Korkeus", c = color)
ax2.tick_params(axis = "y", labelcolor = color)
# Piirretään taustaristikko
ax.set_axisbelow(True)
ax.yaxis.grid(color = 'gray', linestyle = 'dashed')
ax.xaxis.grid(color = 'gray', linestyle = 'dashed')
# Nimetään kuvaaja: Paikkakunta muuttujasta, aika muuttujasta (päivämäärä ja kellonaika)
ax.set_title(nimi1 + " " + aika1.strftime("%d.%m.%Y, %H:%M") + " UTC \n", fontsize = 20)
# Piirretään selite
plt.figlegend(bbox_to_anchor = (1.20, 0.5), fontsize = 15)
plt.show()