Pour obtenir ce graphique, j’ai utilisé les données disponibles sur
https://www.nrel.gov/grid/solar-resource/spectra.html
Les données utiles sont :
- la longueur d’onde
- l’irradiance extraterrestre (hors atmosphère
- l’irradiance au sol
Les données sont dans un fichier Excel :
Pour une importation des données du fichier par le module Pandas, j’ouvre le fichier .xls et le convertis en fichier .csv. Voici le début du script Python (appel des modules et import des données) :
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams["font.family"] = "Roboto"# ou autre police installée.
donnees = pd.read_csv("astmg173.csv",sep='\t',
skiprows=2,
usecols=[0,1,2],
names=['lam','flux_ET','flux_sol'])
lam=donnees['lam']# longueur d'onde (nanomètres)
flux_ET=donnees['flux_ET']
flux_sol=donnees['flux_sol']
Création du graphique :
fig = plt.figure(figsize=(29.7/2.54,21/2.54))# format A4 paysage
ax = plt.subplot(111)
ax.set_title('Rayonnement solaire sur Terre',fontsize=16)
ax.set_xlabel("longueur d'onde (nm)")
ax.set_ylabel(r"Irradiance ($W\cdot m^{-2} \cdot nm^{-1}$)")
ax.set_xticks(np.arange(200,2600,200))
ax.set_xlim(250,2600)
ax.set_ylim(0,2.5)
ax.plot(lam,flux_ET, c='indigo', lw=1,label="hors atmosphère")
ax.plot(lam,flux_sol, c='firebrick', lw=1,label="au sol")
plt.fill_between(lam, 0, flux_sol, color='goldenrod')
Cette dernière ligne remplit l’espace entre la ligne de base et le spectre du flux au sol.
Je calcule ensuite les points de la courbe avec le modèle du corps noir :
h=6.626e-34# constante de Planck
c=3.0e8# célérité de la lumière
k=1.38e-23# constante de Boltzmann
T=5770# température de surface du Soleil
f=8.5e-14#ajustement pour l'échelle (car unités différentes)
lam_m=lam*1e-9#longueur d'onde en mètres
luminance=2*h*c**2*lam_m**(-5)/(np.exp(h*c/(k*T*lam_m))-1)*f
ax.plot(lam,luminance,c='k',label=f"rayonnnement corps noir à {T} K")
Je ne sais plus où j’ai trouvé les annotations des pics d’absorption des molécules.Peut-être sur Wikipedia.
Fin du script :
leg=ax.legend()
for line in leg.get_lines():# épaissir les lignes des légendes
line.set_linewidth(4.0)
# légendes manuelles
ax.text(260,0.04, r"$\mathbf{O_3}$")
ax.text(750,0.1,r"$\mathbf{O_2}$",)
for coord in [[920,0.05],[1120,0.6],[1350,0.25],[1850,0.05],[2500,0.07]]:
ax.text(coord[0],coord[1], r"$\mathbf{H_2O}$")
ax.text(2000,0.15, r"$\mathbf{CO_2}$")
# limites du visible :
ax.axvline(400, ls='--', color='gray', linewidth='0.5',zorder=0)
ax.axvline(800, ls='--', color='gray', linewidth='0.5',zorder=0)
props = dict(boxstyle='round', facecolor='white', linewidth=0, pad=0.3)
ax.annotate("", xy=(400, 2.4), xytext=(800, 2.4),
arrowprops=dict(arrowstyle="<|-|>"))
ax.text(600, 2.4, "domaine visible", fontsize=8, bbox=props,
ha='center', va='center')
ax.text(1.01,0.0,"D. Alberto (www.astrolabe-science.fr) "
"Données : https://www.nrel.gov/grid/solar-resource/spectra.html"
,rotation=90,
transform=ax.transAxes,fontsize=8)
fig.savefig("rayonnement_solaire_sol.png",dpi=300)
fig.savefig("rayonnement_solaire_sol.pdf")
Script complet :
Be First to Comment