add saved figure
This commit is contained in:
parent
f4d216142f
commit
47933a2237
1 changed files with 54 additions and 22 deletions
|
@ -2,7 +2,7 @@
|
|||
"""
|
||||
Created on Mon Feb 10 16:29:16 2025
|
||||
|
||||
@author: Maël Dbq
|
||||
@authors: Maël Dbq & Achille Toupin
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
|
@ -11,6 +11,15 @@ import matplotlib.dates as mdates
|
|||
from scipy.optimize import root_scalar
|
||||
import datetime
|
||||
|
||||
# Données
|
||||
|
||||
rayon_cuve = 0.6 # Rayon de la cuve en m
|
||||
longueur_cuve = 1.77 # Longueur de la cuve en m
|
||||
nb_grad_fleche = 25 # Nombre de graduations sur l'axe des hauteurs
|
||||
nb_grad_volume = 21 # Nombre de graduations sur l'axe des volumes
|
||||
date_debut = datetime.date.today()
|
||||
duree_graphe = 24 # Durée du graphe en mois
|
||||
|
||||
# Fonction pour calculer l'aire du segment de disque pour une flèche donnée
|
||||
def segment_area(f, R):
|
||||
if f == 0:
|
||||
|
@ -29,46 +38,63 @@ def find_f(A, R):
|
|||
except ValueError:
|
||||
return None # Retourne None si aucun zéro trouvé
|
||||
|
||||
# Demande du rayon et de la longueur avec conversion de la virgule
|
||||
rayon_cuve = float(input("Entrez le rayon de la cuve (m) : ").replace(",", "."))
|
||||
longueur_cuve = float(input("Entrez la longueur de la cuve (m) : ").replace(",", "."))
|
||||
# Création d'une échelle temporelle
|
||||
dates = [date_debut.replace(day=1) + datetime.timedelta(days=30*i) for i in range(duree_graphe)]
|
||||
|
||||
# Capacité maximale de la cuve (cylindre entier)
|
||||
volume_max = np.pi * rayon_cuve**2 * longueur_cuve
|
||||
|
||||
# Liste des volumes espacés de 0.1 m³
|
||||
volumes = np.arange(0, volume_max + 0.1, 0.1)
|
||||
# Liste des volumes pour chaque date
|
||||
volumes = np.linspace(0, volume_max, len(dates))
|
||||
|
||||
# Calcul des hauteurs de flèche associées
|
||||
flèches = [find_f(v / longueur_cuve, rayon_cuve) for v in volumes]
|
||||
# Création de la liste de flèches
|
||||
flèches = np.linspace(0, 2 * rayon_cuve, len(dates))
|
||||
|
||||
# Création des graduations de l'axe de droite
|
||||
right_ticks = np.linspace(0, 2 * rayon_cuve, nb_grad_fleche)
|
||||
right_tick_positions = [find_f(v / longueur_cuve, rayon_cuve) for v in right_ticks * volume_max / (2 * rayon_cuve)]
|
||||
|
||||
# Supprimer les valeurs None (au cas où)
|
||||
volumes = np.array([v for i, v in enumerate(volumes) if flèches[i] is not None])
|
||||
flèches = np.array([f for f in flèches if f is not None])
|
||||
|
||||
# Création d'une échelle temporelle : une valeur par mois sur un an
|
||||
dates = [datetime.date.today() + datetime.timedelta(days=30*i) for i in range(len(volumes))]
|
||||
|
||||
# Espacement en flèche pour avoir des graduations équidistantes en volume
|
||||
nb_grad = 10 # Nombre de graduations voulues
|
||||
volumes_grad = np.linspace(0, volume_max, nb_grad)
|
||||
volumes_grad = np.linspace(0, volume_max, nb_grad_fleche)
|
||||
flèche_grad = [find_f(v / longueur_cuve, rayon_cuve) for v in volumes_grad]
|
||||
|
||||
plt.rcParams.update({'font.size': 22}) # Taille du texte
|
||||
|
||||
# Tracer le graphe
|
||||
fig, ax1 = plt.subplots(figsize=(10, 6))
|
||||
fig, ax1 = plt.subplots(figsize=(29.7-1, 21-1)) # Format A4 avec une marge de 1 cm
|
||||
|
||||
# Axe principal : Volume en fonction des mois
|
||||
ax1.plot(dates, volumes, label="Volume (m³)", color='b', linewidth=2)
|
||||
ax1.set_xlabel("Temps (mois)")
|
||||
ax1.set_ylabel("Volume (m³)", color='b')
|
||||
|
||||
volumes_L = volumes * 1000 # Conversion en litres
|
||||
ax1.plot(dates, volumes_L, label="Volume (L)", color='b', linewidth=2, alpha=0)
|
||||
ax1.set_ylabel("Volume (L)", color='b')
|
||||
ax1.tick_params(axis='y', labelcolor='b')
|
||||
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y")) # Format mois année
|
||||
|
||||
ax1.yaxis.set_major_locator(plt.MaxNLocator(nb_grad_volume)) # Configuration du nombre de graduations
|
||||
ax1.set_ylim(bottom=0, top=volume_max * 1000) # Limite inférieure à 0 et supérieure à la capacité maximale
|
||||
|
||||
# Dates en abscisse
|
||||
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%m/%Y")) # Format mois (numérique) année
|
||||
ax1.xaxis.set_major_locator(mdates.MonthLocator()) # Une graduation par mois
|
||||
plt.xticks(rotation=45)
|
||||
|
||||
# Deuxième axe pour les hauteurs de flèche
|
||||
ax2 = ax1.twinx()
|
||||
ax2.plot(dates, flèches, label="Hauteur de remplissage (m)", color='r', linestyle='dashed', linewidth=2)
|
||||
|
||||
# Application des ticks et labels personnalisés
|
||||
ax2.set_yticks(right_tick_positions) # Positions réelles des ticks
|
||||
|
||||
right_ticks_cm = [f * 100 for f in right_ticks] # Valeurs en cm
|
||||
right_ticks_text = [f"{f:.0f}" for f in right_ticks_cm] # Texte des labels
|
||||
ax2.set_yticklabels(right_ticks_text) # Labels affichés
|
||||
|
||||
ax2.set_ylim(bottom=0, top=2 * rayon_cuve) # Limite inférieure à 0 et supérieure à la hauteur maximale
|
||||
|
||||
ax2.plot(dates, flèches, label="Hauteur de remplissage (cm)", color='r', linestyle='dashed', linewidth=2)
|
||||
ax2.set_ylabel("Hauteur de remplissage (m)", color='r')
|
||||
ax2.tick_params(axis='y', labelcolor='r')
|
||||
|
||||
|
@ -76,7 +102,13 @@ ax2.tick_params(axis='y', labelcolor='r')
|
|||
ax2.set_yticks(flèche_grad) # Aligner les graduations de l'axe de droite sur les hauteurs
|
||||
ax2.grid(visible=True, linestyle='--', alpha=0.6, which='both') # Quadrillage en pointillé
|
||||
|
||||
# Légende et titre
|
||||
fig.suptitle("Évolution du remplissage de la cuve au fil du temps")
|
||||
# Ajouter un quadrillage qui colle aux volumes
|
||||
ax1.set_yticks(volumes_grad) # Aligner les graduations de l'axe de gauche sur les volumes
|
||||
ax1.grid(visible=True, linestyle='--', alpha=0.6, which='both') # Quadrillage en pointillé
|
||||
|
||||
# Show the plot
|
||||
fig.tight_layout()
|
||||
plt.show()
|
||||
plt.show()
|
||||
|
||||
# Enregistrement de la figure
|
||||
fig.savefig("graphes/abaque.png")
|
Loading…
Add table
Add a link
Reference in a new issue