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

Calcul scientifique Python Discussion :

Graphique avec scipy ? matplotlib ?


Sujet :

Calcul scientifique Python

  1. #21
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Merci pour toutes ces explications.
    J'ai regardé du côté de curve_fit.
    J'ai fait un test avec mes données :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    dist	eff
    -69	3
    -68	2
    -67	1
    -66	1
    -60	1
    -59	1
    -58	1
    -57	2
    -56	1
    -55	1
    -54	1
    -52	1
    -50	2
    -48	3
    -47	1
    -46	3
    -45	1
    -43	1
    0	1
    1	2
    2	12
    3	18
    4	18
    5	13
    6	9
    7	7
    8	5
    9	3
    10	1
    13	2
    14	3
    15	2
    16	2
    17	2
    18	2
    19	2
    20	2
    21	3
    22	1
    24	1
    25	1
    26	1
    28	2
    31	1
    38	1
    40	2
    et ce code :
    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
    25
    26
    27
    28
    29
    #!/usr/bin/env python
    # -*- coding:Utf-8 -*- 
     
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import pylab
    from scipy import interpolate
    from scipy.optimize import curve_fit
     
    data = np.dtype( [ ('distance',np.int), ('effectif',np.int) ] )
    enreg = np.loadtxt('tmp.txt', dtype=data, skiprows=True)
     
    # Create a function
    def gaussian(x, a, b, c):
        val = a * np.exp(-(x - b)**2 / c**2)
        return val
     
    # Fit
    popt, pcov = curve_fit(gaussian, enreg['distance'], enreg['effectif'])
     
    # Print results
    print "Scale =  %.3f +/- %.3f" % (popt[0], np.sqrt(pcov[0, 0]))
    print "Offset = %.3f +/- %.3f" % (popt[1], np.sqrt(pcov[1, 1]))
    print "Sigma =  %.3f +/- %.3f" % (popt[2], np.sqrt(pcov[2, 2]))
     
    # Plot model
    xm= np.linspace(enreg['distance'][0],enreg['distance'][-1], 100)
    plt.plot(xm, gaussian(xm, popt[0], popt[1], popt[2]))
    plt.show()
    Je vais à présent essayer de le faire pour chaque pic, en modifiant ma variable xm, est ce comme cela que je dois procéder ?
    En revanche, je ne pense pas avoir de bruid de fond dans mes données, du coup, je n'ai pas mis de sigma dans curve_fit ...

  2. #22
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    En fait, j'avais des "trous" dans mes données, c'est à dire que quand je n'avais pas de distance, je ne mettais pas de 0.
    Du coup, en complétant mon jeu de données, j'obtiens le graphiques mis en pièce jointe, qu'en pensez vous ?
    Images attachées Images attachées  

  3. #23
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    En effet il n'y a pas de bruit de fond; 3 paramètres suffissent pour ajuster à une gaussienne.

    J'ai corrigé ton programme, il manquait l'estimation des paramètres d'ajustement (argument p0 de curve_fit). Comme il y a plusieurs pics, la fonction ne sais pas lequel prendre.

    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
    25
    26
    27
    28
    29
    30
    #!/usr/bin/env python
    # -*- coding:Utf-8 -*- 
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
     
    def gaussian(x, a, b, c):
        return a * np.exp(-(x - b)**2 / c**2)
     
    if __name__ == '__main__':
        data = np.dtype( [ ('distance',np.int), ('effectif',np.int) ] )
        enreg = np.loadtxt('tmp.txt', dtype=data, skiprows=True)
     
        # Estimation des paramètres
        amplitude, position, largeur = 18, 4, 2
        params = [ amplitude, position, largeur ]
     
        # Fit
        popt, pcov = curve_fit(gaussian, enreg['distance'], enreg['effectif'], p0=params)
     
        # Print results
        print "amplitude = %.3f +/- %.3f" % (popt[0], np.sqrt(pcov[0, 0]))
        print "position  = %.3f +/- %.3f" % (popt[1], np.sqrt(pcov[1, 1]))
        print "largeur   = %.3f +/- %.3f" % (popt[2], np.sqrt(pcov[2, 2]))
     
        # Plot model
        xm= np.linspace(enreg['distance'][0],enreg['distance'][-1], 512)
        plt.plot(xm, gaussian(xm, popt[0], popt[1], popt[2]), color='r', linewidth=2.0)
        plt.bar( enreg['distance'], enreg['effectif'])
        plt.show()
    Il y a trop peu de statistique dans cette histogramme. Les pics ne ressemblent pas à des gaussiennes. Il faudrait plutôt essayer avec des classes de largeur 2. Ou alors les pics ont-ils vraiment cette forme ? Je n'arrive d'ailleurs pas à ajuster correctement les pics secondaires.

    La méthode d'ajustement est meilleure que l'interpolation car elle élimine le bruit et les irrégularités non physiques, mais il y a trop peu de statistique pour que le résultat soit représentatif du signal d'origine. A toi de choisir.
    Images attachées Images attachées  

  4. #24
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Ah oui effectivement c'est mieux !
    Est ce que je peux inclure plusieurs coordonnées de pic et ne faire qu'un seul schema ? Car j'ai une valeur de 0 après "l'amplitude" du pic, mais j'aimerai que la valeur de ne soit pas 0 ...

Discussions similaires

  1. Graphique avec matplotlib, probléme d'affichage des boutons
    Par astragoth dans le forum Général Python
    Réponses: 0
    Dernier message: 08/04/2010, 08h27
  2. Graphique avec Turbo Pascal 7
    Par Sagiro dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 21/12/2004, 09h52
  3. [Free Pascal] Graphique avec Dev-Pascal
    Par CompuTux dans le forum Free Pascal
    Réponses: 15
    Dernier message: 03/09/2004, 02h15
  4. Caractéristique des Graphiques avec Tchart
    Par bidson dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/01/2004, 11h01
  5. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08

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