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 :

Axes non linéaires dans Matplotlib


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Axes non linéaires dans Matplotlib
    Bonjour,

    je souhaiterais représenter un spectre gradué en longueur d'onde (en bas) et en énergie (en haut).
    Pour le moment j'ai utilisé une solution trouvée dans la gallery

    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
     
    def update_ax2(ax1):
       y1_1, y2_1 = ax1.get_xlim()
       y1_2=h*C/y1_1/e*1E9
       y2_2=h*C/y2_1/e*1E9  
       ax2.set_xlim(y1_2, y2_2)
       ax2.figure.canvas.draw()
     
    fig=plt.figure('Spectrum',figsize=(15, 8))
    ax1=fig.add_subplot(111)
    ax2=ax1.twiny()
    ax1.callbacks.connect("xlim_changed", update_ax2)
    ax1.set_xlim(lambdamin,lambdamax)
     
    ax1.plot(X,Y,'r-',label='Spectrum',linewidth=3)
    La représentation marche bien ... MAIS....
    comme vous pouvez le voir dans le texte il y une correspondance non linéaire entre les échelles: E=h*c/\lambda. Les valeurs des énergies ne sont donc correctes que pour les bornes.

    Peut-on avoir un axe linéaire et un axe non linéaire liés ?
    (je ne vois dans la doc que des axes log et lin, pas d'axes queconques...)
    Merci d'avance pour l'aide,

    lippoi

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    voici la solution que j'ai trouvé, mais je suis preneur d'une meilleure solution !

    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
     
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    e = 1.602177E-19
    C = 2.99792458E8
    h = 6.6260693E-34
     
    dstep = 0.05 # incrément sur l'axe du haut
     
    def ax1_2_ax2(x):
        """
        Conversion from x1 to x2 scale
        """
        return h*C/(x*e)*1E9
     
    def ax2_2_ax1(x):
        """
        Conversion from x2 to x1 scale
        """
        return h*C/(x*e)*1E9
     
    def update_ax2(ax1):
       y1_1, y2_1 = ax1.get_xlim()
       ax2.set_xlim(y1_1,y2_1)
       y1_2=ax1_2_ax2(y1_1)
       y2_2=ax1_2_ax2(y2_1) 
       dy=(y2_2-y1_2)
       Xticlabel=np.arange(np.around(y1_2/dstep)*dstep , 
                           np.around(y2_2/dstep)*dstep , np.sign(dy)*dstep)
       Xtic=ax2_2_ax1(Xticlabel)
       ax2.set_xticks(Xtic)
       ax2.set_xticklabels(Xticlabel)
       ax2.figure.canvas.draw()
     
    fig=plt.figure('Spectrum',figsize=(15, 8))
     
    ax1=fig.add_subplot(111)
    ax2=ax1.twiny()
    ax1.callbacks.connect("xlim_changed", update_ax2)
    ax1.set_xlim(X.min(),X.max())
     
    ax1.plot(X,Y,'r-',label='Spectrum',linewidth=3)
    A noter que
    1/ Il faut mettre à la main l'echantillonage du haut (dstep)
    2/ ax2 correspond aux mêmes valeurs que ax1.
    3/chez moi ça ne marche pas bien pour dstep=0.1

    Lippoi

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2014, 11h23
  2. Graphique non linéaire dans le temps
    Par zbahoui dans le forum 2D
    Réponses: 1
    Dernier message: 30/10/2012, 14h36
  3. Tracer cercle dans ref non linéaire.
    Par Newenda dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/04/2012, 16h10
  4. Instabilité dans un programme de fit non linéaire
    Par Dam2227 dans le forum Mathématiques
    Réponses: 11
    Dernier message: 24/04/2010, 14h17
  5. traitement non linéaire de l'alpha dans une texture
    Par lolo_bobo dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/08/2007, 12h04

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