Maison  >  Article  >  développement back-end  >  Comment réaliser un traçage non bloquant avec le backend Qt4Agg de Matplotlib ?

Comment réaliser un traçage non bloquant avec le backend Qt4Agg de Matplotlib ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 08:32:02192parcourir

How to Achieve Non-Blocking Plotting with Matplotlib's Qt4Agg Backend?

Traçage non bloquant avec Matplotlib

Dans Matplotlib, un blocage d'exécution se produit souvent lors du traçage de fonctions. Cela peut gêner les applications interactives qui nécessitent des mises à jour en temps réel. Pour résoudre ce problème, il est essentiel de comprendre comment les backends affectent le comportement de blocage et d'exploiter les techniques appropriées pour le traçage non bloquant.

Impact des backends sur l'exécution du blocage

Matplotlib utilise une variété de backends pour le rendu GUI. Alors que certains backends, tels que Qt4Agg, prennent en charge le traçage non bloquant, d'autres ne le font pas. Cela signifie que l'utilisation de show(block=False) peut entraîner le gel des fenêtres ou un comportement incorrect en fonction du backend sélectionné.

Examen du code

En examinant le code fourni, le l'utilisation de show(block=False) semble en effet être le coupable du problème de fenêtre gelée. En effet, le backend de Qt4Agg ne prend pas en charge le mode de blocage pour les applications non graphiques.

Technique de traçage non bloquant

Pour obtenir un traçage non bloquant dans Qt4Agg, il est recommandé pour utiliser l'approche suivante :

  1. Invoquez plt.ion() pour activer le mode interactif, qui permet un contrôle manuel du redessin.
  2. Appelez plt.show() sans spécifier block= FAUX. Cela affiche la fenêtre de tracé sans bloquer l'exécution.
  3. Utilisez plt.pause(0.001) ou un délai similaire pour donner le temps au tracé de s'afficher avant de continuer. Le délai spécifié peut être ajusté en fonction de la fréquence de mise à jour souhaitée.

Voici une version mise à jour de votre code qui implémente cette technique non bloquante :

<code class="python">import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)  # Adjust this delay based on desired update frequency
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()</code>

En implémentant ces modifications , le code permettra un traçage non bloquant sans créer de nouvelles fenêtres à chaque mise à jour.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn