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.31.0)
Collecting defusedxml (from fmiopendata)
  Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 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.6)
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.1.0)
Requirement already satisfied: certifi>=2017.4.17 in /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages (from requests->fmiopendata) (2023.11.17)
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=77e57bc29f0708f6ef314a68a981ffc135b777c4e3a6e80d17c0069dc991b448
  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
[notice] A new release of pip is available: 23.0.1 -> 23.3.2
[notice] To update, run: pip install --upgrade pip
# 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)
2344
# 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()
../_images/c33276df7a76a103f8471dca1022cccd01faba8c45bd2befb536b76197be29a6.png
# 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)
2606
# 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()
../_images/97ad86fd95f0758520a40aabeb77ffa9614d7b0196fcc16949c0092b34b8c108.png