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 :

Mise a jour d’une figure Matplotlib sous macOS


Sujet :

Python

  1. #1
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut Mise a jour d’une figure Matplotlib sous macOS
    Salut à tous !

    Je tente de réaliser des figures interactives avec Matplotlib. Soit le code suivant, qui permet de faire apparaître ou disparaître une courbe lorsqu’on clique sur la ligne de sa légende (il faut bien cliquer sur la ligne) – en passant, ce code n’est pas de moi :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import numpy as np
    import matplotlib.pyplot as plt
     
     
    t = np.linspace(0, 1)
    y1 = 2 * np.sin(2*np.pi*t)
    y2 = 4 * np.sin(2*np.pi*2*t)
     
    fig, ax = plt.subplots()
    ax.set_title('Click on legend line to toggle line on/off')
    line1, = ax.plot(t, y1, lw=2, label='1 Hz')
    line2, = ax.plot(t, y2, lw=2, label='2 Hz')
    leg = ax.legend(fancybox=True, shadow=True)
     
    lines = [line1, line2]
    lined = {}  # Will map legend lines to original lines.
    for legline, origline in zip(leg.get_lines(), lines):
        legline.set_picker(True)  # Enable picking on the legend line.
        lined[legline] = origline
     
     
    def on_pick(event):
        # On the pick event, find the original line corresponding to the legend
        # proxy line, and toggle its visibility.
        legline = event.artist
        origline = lined[legline]
        visible = not origline.get_visible()
        origline.set_visible(visible)
        # Change the alpha on the line in the legend so we can see what lines
        # have been toggled.
        legline.set_alpha(1.0 if visible else 0.2)
        fig.canvas.draw()
     
    fig.canvas.mpl_connect('pick_event', on_pick)
    plt.show()
    J’ai testé ce code sous Linux et il fonctionne comme attendu. Il m’a été rapporté qu’il fonctionne également sous Windows.

    En revanche, le comportement sous macOS est étrange : lorsque l’on clique sur la ligne de légende, la courbe ne disparaît pas, mais en revanche, si on change la taille de la fenêtre, alors la courbe disparaît. Il semble que le graphique n’est pas mis à jour. Je dois avoir oublié quelque chose – encore que je ne comprends pas vraiment la différence de comportement entre les systèmes, mais passons. J’ai cherché sur le net et je n’ai rien trouvé pour m’aider. Est-ce que quelqu’un sait comment corriger ce problème ?

    À bientôt.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Le Farfadet Spatial Voir le message
    Est-ce que quelqu’un sait comment corriger ce problème ?
    Commencez par valider la version de Tk utilisée sous OSX sinon faites une mise à jour.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    Merci pour la réponse.

    Si je suis très habitué à Linux, je dois reconnaître que je découvre macOS, je ne suis pas encore à l’aise – et, bon, je préfère Linux, mais passons.

    Donc, je ne suis pas très sûr, mais, d’après le lien donné, il me semble qu’il me faut la version 8.6.11 ou supérieure de TCL/TK. Or, il me semble que c’est la version 8.6.12 qui est installée sur mon système :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    % tclsh
    % info patchlevel
    8.6.12
    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
    % brew info tcl-tk
    ==> tcl-tk: stable 8.6.12 (bottled) [keg-only]
    Tool Command Language
    https://www.tcl-lang.org
    /opt/homebrew/Cellar/tcl-tk/8.6.12_1 (3,045 files, 52MB)
      Poured from bottle on 2022-06-21 at 11:15:31
    From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/tcl-tk.rb
    License: TCL
    ==> Dependencies
    Required: openssl@1.1 ✔
    ==> Caveats
    The sqlite3_analyzer binary is in the `sqlite-analyzer` formula.
     
    tcl-tk is keg-only, which means it was not symlinked into /opt/homebrew,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
     
    If you need to have tcl-tk first in your PATH, run:
      echo 'export PATH="/opt/homebrew/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
     
    For compilers to find tcl-tk you may need to set:
      export LDFLAGS="-L/opt/homebrew/opt/tcl-tk/lib"
      export CPPFLAGS="-I/opt/homebrew/opt/tcl-tk/include"
     
    For pkg-config to find tcl-tk you may need to set:
      export PKG_CONFIG_PATH="/opt/homebrew/opt/tcl-tk/lib/pkgconfig"
     
    ==> Analytics
    install: 70,464 (30 days), 221,481 (90 days), 1,974,934 (365 days)
    install-on-request: 11,479 (30 days), 39,115 (90 days), 289,032 (365 days)
    build-error: 163 (30 days)
    Après, je reconnais que je ne suis pas très certain de l’installation de Python que j’ai faite : j’ai utilisé l’installateur en provenance de python.org, mais j’ai l’impression d’avoir un mélange avec HomeBrew :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    % ls /opt/homebrew/bin/python3*
    /opt/homebrew/bin/python3		/opt/homebrew/bin/python3.10-config
    /opt/homebrew/bin/python3-config	/opt/homebrew/bin/python3.9
    /opt/homebrew/bin/python3.10		/opt/homebrew/bin/python3.9-config
     
    % ls /usr/local/bin/python3*
    /usr/local/bin/python3			/usr/local/bin/python3.10
    /usr/local/bin/python3-config		/usr/local/bin/python3.10-config
    /usr/local/bin/python3-intel64		/usr/local/bin/python3.10-intel64

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    La version installée sur le système, c'est bien mais il faut s'assurer que c'est aussi la version utilisée par Python avec des commandes (python) du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import tkinter
    >>> tcl = tkinter.Tcl()
    >>> print(tcl.call("info", "patchlevel"))
    8.6.9
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    Je pense que la version chargée est la bonne dans les deux cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % /opt/homebrew/bin/python3
    Python 3.10.6 (main, Aug 11 2022, 13:36:31) [Clang 13.1.6 (clang-1316.0.21.2.5)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tkinter
    >>> tcl = tkinter.Tcl()
    >>> print(tcl.call("info", "patchlevel"))
    8.6.12
    >>> exit()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % /usr/local/bin/python3
    Python 3.10.5 (v3.10.5:f377153967, Jun  6 2022, 12:36:10) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tkinter
    >>> tcl = tkinter.Tcl()
    >>> print(tcl.call("info", "patchlevel"))
    8.6.12
    >>> exit()

  6. #6
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    J’imagine que s’il n’y a plus de réponse, c’est que personne n’a quelque chose à proposer, mais à tout hasard, je tente de relancer une dernière fois la discussion.

    Il ne semble pas que le problème vienne de la version de TCL/TK. Est-ce que quelqu’un aurait une piste pour résoudre le problème ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Le Farfadet Spatial Voir le message
    J’imagine que s’il n’y a plus de réponse, c’est que personne n’a quelque chose à proposer, mais à tout hasard, je tente de relancer une dernière fois la discussion.
    Désolé... j'ai regardé un peu ce qui traînait sur le sujet.
    En prenant le temps de lire les mises à jours concernant ce problème, j'ai pu voir que depuis la 3.9+, les développeurs avaient décidé de packager Tk avec Python (plutôt que de s'embourber avec les différentes moutures qui traînaient sur les environnements OSX).
    Mais je n'ai pas trouvé grand chose d'autre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    Merci pour la réponse.

    Je comprends parfaitement que personne sur ce forum n’ai la solution ou le temps de me la donner, tout est bénévole ici. Merci d’avoir pris le temps d’essayer de m’aider. Je vais demander sur la liste Python-help et je tiendrais au courant.

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Moi je pencherais plutôt pour une mise en cache des opérations sous MAC. Lorsque vous redimensionnez la fenêtre vous forcez le recalcule de l'affichage graphique et donc toutes les modifs faites avant sont affichées. Sinon toutes modifs est mise en cache et n'est affiché que lorsque cela est explicitement demandé. Tentez de changer une courbe de couleur par exemple, même sans le mode interactif, je pense que le problème sera semblable, et pourra conforter ou réfuter mon intuition.

    Si vous essayez de remettre un plt.show après chaque clic comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        fig.canvas.draw()
        plt.show()
    ca donne pareil ?

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    Hello,
    Citation Envoyé par lg_53 Voir le message
    Si vous essayez de remettre un plt.show après chaque clic comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        fig.canvas.draw()
        plt.show()
    ca donne pareil ?
    j'ai essayé le code du Farfadet spacial sous MacOs Catalina 10.15 (python 3.8 matplotlib 3.5.3) , j'ai le problème même avec le code de lg_53. J'ai trouvé un rapport de bug de matplotlib concernant ce problème ici . D'après les réponses le problème sera corrigé en version 3.6 de matplotlib et le moyen de contournement dans une version 3.5.x de matplotlib est de remplacer le fig.canvas.draw() par un fig.canvas.draw_idle(). Effectivement en utilisant ce code je n'ai plus le souci :

    Nom : MatPlotlibMacOs.gif
Affichages : 86
Taille : 72,8 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Problème de mise a jour de driver vidéo sous Ubuntu.
    Par shadock0 dans le forum Matériel
    Réponses: 5
    Dernier message: 29/03/2012, 16h35
  2. Mise à jour d’une matrice sous Word
    Par diarise dans le forum Word
    Réponses: 10
    Dernier message: 09/04/2010, 17h44
  3. Mise A Jour Avec Des Dates Sous Access
    Par jo001 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/05/2007, 15h55
  4. Req mise a jour de ligne en ligne ds sous form
    Par martonpylon12 dans le forum IHM
    Réponses: 4
    Dernier message: 20/06/2005, 19h00
  5. mise a jours des données sous access
    Par puyopuyo dans le forum ASP
    Réponses: 4
    Dernier message: 25/05/2004, 12h46

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