# -*- coding: utf-8 -*-
"""Tracé d'un graphique de points expérimentaux et modélisation avec une droite."""
import numpy as np
import matplotlib.pyplot as plt

# listes des points expérimentaux - elles doivent avoir la même longueur!
# pression en hPa
p = [1021,1057,1092,1132,1164,1209,1253,1308,1363,1419,1479,1539,1618,1713,1800,1899]
# volume en mL
Delta_V = [30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15]

def calculer_inverse(liste_valeurs):
    """Fonction calculant l'inverse de chaque valeur d'une liste.
    exemple:  inverse_p = calculer_inverse( p )"""
    nouvelle_liste = []
    for v in liste_valeurs:
        nouvelle_liste.append(1 / v)
    return nouvelle_liste

# on trace Y en fonction de X
X = calculer_inverse(p)
Y = Delta_V

# on modélise Y en fonction de X par une droite y = a x  + b
[a, b] = np.polyfit(X, Y, 1)
#on récupère une fonction permettant de calculer les valeurs grâce au modèle
equation_droite = np.poly1d([a, b])
#fabrique le texte pour l'équation y=b + a.x.
text_equation_droite = f"modèle y= a.x + b avec\n a = {a:0.2f} et b = {b:0.2f}"

# données à tracer
plt.plot(X, Y, "b+", label="points expérimentaux")
plt.plot(X, equation_droite(X), "r--", lw=1, label=text_equation_droite)
plt.legend(loc="lower right")

# paramètres du graphique: titre, légendes, limites, etc.
plt.title('$\\Delta V$ en fonction de $\\frac{1}{p}$')
#plt.axis("square")  # pour avoir la même échelle sur les axes (peut être omis)
#plt.xlim(0, 8)  # valeurs min et max pour l'axe des x (peut être omis)
plt.xlabel("$\\frac{1}{p}$ (en $hPa^{-1}$)")
#plt.ylim(0, 10)  # valeurs min et max pour l'axe des y (peut être omis)
plt.ylabel("$\\Delta V$  (en $mL$)")

# affichage du graphique
plt.show()