Pense-bête Python 🐍#

Aide pour les lycéens

Courbes et points#

# matplotlib est la bibliothèque qui permet de tracer les graphiques
import matplotlib.pyplot as plt

plt.clf()

X = [0, 0.021, 0.039, 0.063]  # Valeur des x
Y = [0, 0.54, 1.08, 1.62]  # Valeur des y

plt.plot(X, Y, '-x', color='blue')  # On relie les points
plt.plot(X, Y, 'x', color='red')  # On ne relie pas les points

X2 = [0.045]
Y2 = [0.85]

plt.plot(X2, Y2, 'o', color='green', markersize=20) # Ajoute un gros point vert 

plt.xlabel("Légende des abscisses")
plt.ylabel("Légende des ordonnées")
plt.title("Titre du graphique")

plt.grid()  # Si on veut afficher une grille
plt.show()  # Afficher l'image

Changer les axes#

plt.xlim(-0.01, 0.07)  # Limites pour l'axe des abscisses (x)
plt.ylim(-0.1, 2)      # Limites pour l'axe des ordonnées (y)

Changer les graduations#

# graduation majeur de [0 à 1[ de 0.1 en 0.1
plt.xticks(np.arange(0,1,0.1))
# Affiche les sous-graduations
plt.minorticks_on()

Tracer une régression linéaire (conductimétrie)#

Copier ce bout de code en haut du script :

import numpy as np
def trace_regression_lineaire(plt, X, Y, nb_points_depart, nb_points_fin, intervalle, couleur):
    # Sélectionner les sous-listes des X et Y entre nb_points_depart et nb_points_fin
    X_sub = X[nb_points_depart:nb_points_fin+1]
    Y_sub = Y[nb_points_depart:nb_points_fin+1]
    
    # Effectuer la régression linéaire
    fit = np.polyfit(X_sub, Y_sub, 1)  # Polyfit de degré 1 pour la régression linéaire
    pente, intercept = fit
    
    # Créer les valeurs de X pour tracer la ligne dans l'intervalle fourni
    X_ligne = np.linspace(intervalle[0], intervalle[1], 100)
    Y_ligne = pente * X_ligne + intercept
    
    # Tracer la ligne de régression avec la couleur choisie en pointillé
    plt.plot(X_ligne, Y_ligne, linestyle='--', color=couleur, label=f"Régression linéaire (indices {nb_points_depart}-{nb_points_fin})")

Que l’on utilisera ensuite ainsi :

trace_regression_lineaire(plt, X, Y, 1, 2, [0.02, 0.1], 'green')

Tracer une droite#

Verticale#

import matplotlib.pyplot as plt
plt.clf()
plt.figure()

# Tracer une ligne verticale à x=5
plt.axvline(x=5, color='green', linestyle='--', label="Ligne verticale (x=5)")

plt.grid(True)
plt.legend()
plt.show()

Horizontale#

# Tracer une ligne verticale à x=5
plt.axhline(y=10, color='purple', linestyle='-', label="Ligne horizontale (y=10)")

Ajouter du texte#

# Importation de la bibliothèque matplotlib
import matplotlib.pyplot as plt

plt.clf()
plt.figure()

# Ajouter du texte à des endroits spécifiques
plt.text(6, 12, "Texte1", fontsize=12, color='blue')  # Texte au point (6, 12)
plt.text(2, 8, "Texte2", fontsize=12, color='red')   # Texte au point (2, 8)
plt.text(8, 4, "Texte3", fontsize=12, color='orange')  # Texte au point (8, 4)

# Ajouter un titre et des légendes aux axes
plt.title("Exemple de ligne verticale, horizontale et de texte")
plt.xlabel("Axe des X")
plt.ylabel("Axe des Y")

plt.xlim(0,10)
plt.ylim(0,15)

plt.grid(True)
plt.legend()
plt.show()

Regression linéaire#

import matplotlib.pyplot as plt
import numpy as np # Bibliothèque scientifique

plt.clf()
X = np.array([0, 0.021, 0.039, 0.063])
Y = np.array([0, 0.84, 1.45, 2.4])

plt.plot(X, Y, 'x', color='blue')  # On trace

plt.xlabel("Légende des abscisses")
plt.ylabel("Légende des ordonnées")
plt.title("Titre du graphique")

plt.grid()

# Demande à Numpy de trouver les coefficients a et b pour y = a x + b
fit = np.polyfit(X, Y, 1)

coefficient_directeur = fit[0] #a dans y = ax + b
print("coefficient directeur :", coefficient_directeur)

ordonnee_origine = fit[1] #b dans y = ax + b
print("ordonnée à l'origine:", ordonnee_origine)

print("Equation : y = " + str(coefficient_directeur) + ' x + ' + str(ordonnee_origine) )
Modelisation = coefficient_directeur * X + ordonnee_origine
plt.plot(X, Modelisation, color='red')

plt.show()

Modélisation par une parabole#

import numpy as np
import matplotlib.pyplot as plt

dt = 0.03333333333333333
y= np.array([42.719, 42.719, 42.719, 43.263, 43.263, 43.535, 43.535, 43.824, 44.096, 44.367999999999995, 44.367999999999995, 44.64, 44.929, 45.745000000000005, 45.473, 46.306, 46.306, 46.577999999999996, 46.577999999999996, 47.68299999999999, 47.955, 47.955, 48.227, 48.788, 49.06, 49.332, 50.437, 50.437, 50.437, 51.27, 52.086, 52.64699999999999, 53.190999999999995, 53.752, 53.752, 54.023999999999994, 55.401, 55.961999999999996, 56.778000000000006, 57.339, 57.339, 57.883, 58.715999999999994, 59.821, 60.36500000000001, 61.19799999999999, 60.926, 62.303, 62.575, 63.952, 65.057, 65.329, 65.329, 66.706, 67.539, 68.37199999999999, 69.188, 70.565, 70.854, 71.398, 72.77499999999999, 73.88, 74.713, 76.09, 76.09, 76.92299999999999, 78.011, 79.405, 80.221, 81.887, 81.887, 82.99199999999999, 83.808, 85.47399999999999])

# Création du tableau de temps
t = np.arange(len(y)) * dt

# Ajustement par une parabole
coeffs = np.polyfit(t, y, 2)
a = coeffs[2]
b = coeffs[1]
c = coeffs[0]

print("Les coefficients de la parabole sont y(t) = a + b t + c t^2 :")
print("a = ", a)
print("b = ", b)
print("c = ", c)

# Génération des valeurs ajustées
t_fit = np.linspace(t[0], t[-1], 500)
y_fit = np.polyval(coeffs, t_fit)

# Tracé des points de données et de la courbe ajustée
plt.figure(figsize=(8, 6))
plt.plot(t, y, 'o', label='Données')
plt.plot(t_fit, y_fit, '-', label='Ajustement quadratique')
plt.xlabel('Temps t')
plt.ylabel('Valeur y')
plt.title('Ajustement parabolique des données')
plt.legend()
plt.grid(True)
plt.show()

Histogramme#

import numpy as np
import matplotlib.pyplot as plt
plt.clf()
pH1 = [1,2,3,4,5,2,3,1,2] # A completer avec les mesures du papier pH
pH2 = [2,3,1,4,2,1,2,1,3] # A completer avec les mesures du pH-metre
plt.hist(pH1, 10, label='Mesures Serie 1') # 10 groupes de mesures
plt.hist(pH2, 10, label='Mesures Serie 2')

plt.xlabel("Mesures")
plt.ylabel("Nombre de mesures")
plt.title("Histogramme de la serie de mesures")
plt.legend()
plt.show()

Dérivée (par exemple pour un dosage)#

[!WARNING] Deux axes Ici c’est plus délicat car il y a deux axes, un à droite et un à gauche. Cela correspond pour matplotlib à deux subplots

# Importation de la bibliothèque matplotlib pour tracer les graphiques
import matplotlib.pyplot as plt
import numpy as np

plt.clf()

# Liste des volumes de NaOH en mL
volumes = [
    0, 0.75, 2.16, 3.42, 4.52, 5.48, 6.29, 6.98, 7.55, 8.02, 8.41, 8.72, 8.97,
    9.18, 9.34, 9.48, 9.58, 9.67, 9.74, 9.79, 9.83, 9.91, 9.93, 9.96, 9.98,
    9.99, 10.00, 10.01, 10.02, 10.04, 10.07, 10.12, 10.15, 10.27, 10.34, 10.43,
    10.54, 10.69, 10.87, 11.11, 11.41, 11.79, 12.29, 12.94, 13.8, 14.95
]

# Liste des valeurs de pH correspondantes
pH = [
    1.3, 1.35, 1.45, 1.55, 1.65, 1.76, 1.85, 1.95, 2.05, 2.15, 2.26, 2.36, 2.45,
    2.55, 2.66, 2.75, 2.85, 2.95, 3.05, 3.15, 3.25, 3.5, 3.6, 3.85, 4.1,
    4.35, 7.6, 8.6, 9.85, 10.1, 10.35, 10.6, 10.7, 10.95, 11.05, 11.15, 11.25,
    11.35, 11.45, 11.55, 11.65, 11.75, 11.85, 11.95, 12.05, 12.15
]

# Calcul de la dérivée (différence entre valeurs adjacentes)
dpH = np.diff(pH)
dV = np.diff(volumes)

# Calcul de la dérivée du pH par rapport au volume (dpH/dV)
derivative = dpH / dV

# Créer la figure et l'axe principal
fig, ax1 = plt.subplots()

# Tracer la courbe de pH en fonction du volume de NaOH ajouté sur l'axe principal (gauche)
ax1.plot(volumes, pH, 'o-', color='blue', label="pH en fonction du volume de NaOH ajouté")
ax1.set_xlabel("Volume ajouté (mL)")
ax1.set_ylabel("Valeur du pH", color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# Créer un deuxième axe y partageant le même axe x
ax2 = ax1.twinx()

# Tracer la courbe de la dérivée du pH par rapport au volume sur le second axe (droite)
ax2.plot(volumes[:-1], derivative, 'o-', color='red', label="Dérivée du pH par rapport au volume")
ax2.set_ylabel("Dérivée du pH (dpH/dV)", color='red')
ax2.tick_params(axis='y', labelcolor='red')

# Ajouter une grille à l'axe principal
ax1.grid(True)

# Afficher le graphique
plt.title("Courbe de titrage : pH et sa dérivée en fonction du volume ajouté")
plt.show()

Changer l’échelle#

Verticale#

ax2.set_ylim(0,20)

Horizontale#

ax2.set_ylim(0,20)

Changer les graduations des axes#

# graduation majeur de [0 à 20[ de 1 en 1
ax1.set_xticks(np.arange(0,20,1))
# Sous graduation de [0 à 20[] de 0.5 à 0.5
ax1.set_xticks(np.arange(0,20,0.5),minor=True)

Fonctions utiles#

import random
import numpy as np

# -------------------------
#   Générer des listes
# -------------------------

# Générer une liste de 50 valeurs aléatoires entre -100 et 100
valeurs_aleatoires = [random.randint(-100, 100) for _ in range(50)]
# Générer une liste de 50 valeurs entre 0, 49
valeurs = np.arange(50)

# -------------------------
#      Dérivée
# -------------------------

# Calcul de la dérivée de la liste des valeurs aléatoires
derivative_aleatoires = np.diff(valeurs_aleatoires)
derivative_valeurs = np.diff(valeurs)
derivative = derivative_aleatoires / derivative_valeurs

# -------------------------
#   Fonctions utiles
# -------------------------

# Trouver l'indice du maximum dans valeurs_aleatoires
indice_max = np.argmax(valeurs_aleatoires)
# Trouver la valeur correspondante dans la liste valeurs
valeur_correspondante = valeurs[indice_max]

# Calculer la moyenne et l'écart type
moyenne = np.mean(valeurs_aleatoires)
ecart_type = np.std(valeurs_aleatoires)
print("Moyenne : ", moyenne)
print("ecart_type : ", ecart_type)

Trouver la valeur maximale d’une liste#

# Trouver l'indice du maximum dans valeurs_aleatoires
indice_max = np.argmax(valeurs_aleatoires)
# Trouver la valeur correspondante dans la liste valeurs
valeur_correspondante = valeurs[indice_max]

Import / Exporter des fichiers CSV#

Séparateurs décimaux et délimiteurs

  • Dans un fichier CSV, les données sont séparées par délimiteurs.

  • Si nous travaillons avec des données numériques il faut aussi tenir compte du séparateur décimal qui peut être une virgule

⏬Importer des données#

import pandas as pd
import numpy as np

# Spécifier le chemin vers ton fichier CSV
fichier_csv = "ton_fichier.csv"

# Charger le fichier CSV avec les options spécifiques
df = pd.read_csv(
    fichier_csv,        # Le fichier CSV à charger
    skiprows=5,         # Omet les 5 premières lignes
    delimiter=';',      # Définit le délimiteur comme un point-virgule (;)
    decimal=',',        # Définit la virgule comme séparateur décimal
    header=2            # Utilise la 3ème ligne (index 2) pour les noms des colonnes
)

# Récupérer une colonne spécifique dans une liste numpy
# Ici, on suppose que la colonne qui nous intéresse s'appelle 'ColonneCible'
colonne_numpy = df['ColonneCible'].to_numpy()

# Afficher la colonne sous forme de tableau numpy
print(colonne_numpy)

⏫Exporter les données#

import pandas as pd
import numpy as np

# Exemple de trois listes NumPy
liste1 = np.array([1.2, 2.4, 3.6])
liste2 = np.array([10, 20, 30])
liste3 = np.array(['A', 'B', 'C'])

# Créer un DataFrame à partir des listes NumPy
df = pd.DataFrame({
    'Liste1': liste1,
    'Liste2': liste2,
    'Liste3': liste3
})

# Spécifier le chemin où tu veux sauvegarder le fichier CSV
fichier_csv_export = "mes_listes_exportees.csv"

# Exporter le DataFrame vers un fichier CSV
df.to_csv(
    fichier_csv_export,  # Le fichier CSV de destination
    sep=';',             # Utilise un point-virgule comme délimiteur
    decimal=',',         # Utilise la virgule comme séparateur décimal
    index=False,         # Omet l'index lors de l'exportation
    header=True          # Inclut les noms des colonnes dans l'export
)

print("Listes NumPy exportées avec succès dans le fichier CSV !")