IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Lissage de courbe matplotLib


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut Lissage de courbe matplotLib
    Bonjour à tous,

    Je n'arrive pas à obtenir le lissage attendu sur une courbe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.interpolate import make_interp_spline, CubicSpline, UnivariateSpline
     
    x = (0,3,5,10,30,60,90,120,150,180)
    y = (20,890,1140,1200,1300,1350,1300,1200,1200,1200)
     
    x_new = np.linspace(min(x), max(x),130)
     
    f =  make_interp_spline(x, y)
    f1 = CubicSpline(x, y)
    f2 =  UnivariateSpline(x, y)
    #f2.set_smoothing_factor(0.9)
     
    y_smooth=f(x_new)
    y1_smooth=f1(x_new)
    y2_smooth=f2(x_new)
     
    plt.plot(x, y, '--o', label = 'standard')
    plt.plot(x_new, y_smooth, '-', label ='spline')
    plt.plot(x_new, y1_smooth, '-', label ='spline1')
    plt.plot(x_new, y2_smooth, '-', label ='spline2')
    plt.legend( loc='best')
    plt.show()
    Quelles que soient les méthodes employées j'ai un espèce virgule non souhaitée... Avez une idée une solution, je vois pas ou ce que je zappe.


    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Aelurus_ Voir le message
    je vois pas ou ce que je zappe.
    Peut-être que ce qui s'affiche c'est le vrai résultat d'un lissage mathématique
    J'ai essayé ton code mais avec des données réduites...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = (0,3,5,10,30)
    y = (20,890,1140,1200,1300)
    ... et au résultat, j'ai une cuvette là où la courbe originelle est droite.

    Ensuite, je décide de tracer une vraie fonction affine (y=2x)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=tuple(range(20))
    y=tuple(z*2 for z in x)
    Là, le lissage correspond exactement à la droite.

    Ensuite je décide d'introduire des variations en plus ou en moins sur chaque y...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import random
    x=tuple(range(20))
    y=tuple(z*2+random.uniform(-2, 2) for z in x)
    ... la courbe intègre donc ces variations mais le lissage, lui, reste parfait.

    Et enfin je décide que les variations seront proportionnelles au point... y=tuple(z*2+random.uniform(-z, z) for z in x) mais là encore le lissage est exact.

    Donc peut-être qu'il n'y a pas de problème sur le lissage mais seulement sur le nb de points utilisés pour l'échantillonnage...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Curieux
    Inscrit en
    Octobre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2017
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Donc peut-être qu'il n'y a pas de problème sur le lissage mais seulement sur le nb de points utilisés pour l'échantillonnage...
    oui ˆˆ je me suis posé la question, j'ai aussi tenté sous ecxel et avec les mêmes entrées j'obtiens pourtant bien le résultat souhaité... Je ne sais pas du tout comment Ecxel s'y prend.
    Donc c'est juste le traitement à identifier. Je ne sais pas comment ecxel s'y prend pour faire le lissage mais je n'ai pas de virgule en debut ni de vague en fin de tracer.
    Des que j'ai identifier le traitement ou le nom du traitement je reviens.

    Merci

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    ça m'intéresse également. Cette "virgule" est typique de l'utilisation d'un polynôme de degré trop élevé pour les données disponibles (par exemple avoir 3 points et fitter un polynôme de degré 3). On peut voir cet effet en faisant varier le degré de la spline :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    x = (0,3,5,10,30,60,90,120,150,180)
    y = (20,890,1140,1200,1300,1350,1300,1200,1200,1200)
     
    x_new = np.linspace(min(x), max(x), 130)
     
    plt.plot(x, y, '--o', label='standard')
     
    for order in (1, 2, 3, 5, 7, 9):
        f = make_interp_spline(x, y, k=order)
        y_smooth = f(x_new)
        plt.plot(x_new, y_smooth, '-', label='k=%i' % order)
     
    plt.legend(loc='best')
    plt.grid()
    plt.show()
    Nom : Figure_1.png
Affichages : 4452
Taille : 36,4 Ko

    Par curiosité j'ai essayé de rajouter des points par interpolation linéaire avant de fitter la spline. Sans effet. Ou alors il faudrait rafiner seulement à certains endroits.

    J

  5. #5
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Salut la team,

    j'ai trouvé une solution avec GEKKO et les splines, le rendu me va
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import matplotlib.pyplot as plt
    import numpy as np
    from gekko import GEKKO
     
    x = ([0,3,5,10,30,60,90,120,145,180,240])
    y = ([20,890,1140,1200,1300,1350,1300,1200,1200,1200,1200])
     
    m= GEKKO()
    m.x = m.Param(value = np.linspace(0,240))
    m.y = m.Var()
    m.cspline(m.x,m.y,x,y)
    m.options.IMODE = 2
    m.solve(disp = False)
     
    plt.plot(x, y, 'bo', label='RWS')
    plt.plot(m.x, m.y, 'r--', label='cubic spline')
    plt.legend(loc = 'best')
    plt.xlabel('Durée [min]')
    plt.ylabel('Température [°C]')
     
    plt.show()
    Le resultat est pas mal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Fortran 77][Débutant] Méthode de lissage de courbe
    Par fp_81-69 dans le forum Fortran
    Réponses: 9
    Dernier message: 29/06/2007, 15h17
  2. Lissage de courbe
    Par Tchaill39 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 17/09/2006, 09h53
  3. lissage de courbe
    Par athomaspascal dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 03/09/2006, 18h44
  4. Réponses: 4
    Dernier message: 24/11/2005, 19h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo