Je suis nouveau dans le codage et en ce moment j'essaie de coder une application qui suit un mouvement à partir d'une simulation et visualise le mouvement dans la fenêtre de tracé.
Aucune commande de pause ne semble fonctionner. p >
Voici le code mis à jour avec la suggestion de la réponse de @ bf-g ci-dessous incoorporated:
def handle_close(evt): raise SystemExit('Closed figure, exit program.') fig = plt.figure() fig.canvas.mpl_connect('close_event', handle_close)# Definition der figure while True: plt.clf() # vorherige Plots clearen for i in range(0, int(alpha_max), 5): plt.plot(Drehachse_x + Radius*np.cos((i+alpha_0)*np.pi/180), Drehachse_y + Radius*np.sin((i+alpha_0)*np.pi/180), color='red', marker='*', markersize=1) for i in range(0, int(alpha_max), 2): plt.plot(Drehachse_x + Radius_Heckklappe*np.cos((i+alpha_0+beta_0+delta)*np.pi/180), Drehachse_y + Radius_Heckklappe*np.sin((i+alpha_0+beta_0+delta)*np.pi/180), color='red', marker='*', markersize=1.5) alpha = "PATH" Schwerpunkt_x = "PATH" Schwerpunkt_y = "PATH" Spindel_Heck_x = "PATH" Spindel_Heck_y = "PATH" x=(Drehachse_x, Schwerpunkt_x) y=(Drehachse_y, Schwerpunkt_y) x1=(Spindel_Heck_x, Spindel_Karo_x) y1=(Spindel_Heck_y, Spindel_Karo_y) plt.axis('equal') plt.axis([3100, 3800, 600, 1400]) plt.plot(x,y, color="blue", linewidth=2.0, linestyle="-", marker='o', label='$Heckklappe$') plt.plot(x1, y1, color="green", linewidth=2.0, linestyle="-", marker='o', label='$Spindel$') plt.plot(x_g_max, y_g_max, color="orange", linewidth=2.0, linestyle="--", marker='*', label='$Maximal$') plt.plot(x_g_min, y_g_min, color="red", linewidth=2.0, linestyle="--", marker='*', label='$Minimal$') plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), fancybox=True, shadow=True, ncol=5) plt.pause(0.001) plt.text(0.35, 0.5, 'Close Me!', dict(size=30)) plt.draw()
Il fait ce que je veux qu'il fasse, mais si j'essaye de ferme la fenêtre de tracé, elle continue de s'ouvrir jusqu'à ce que je ferme le programme.
3 Réponses :
Je pense que c'est parce que votre plt.draw ()
est à l'intérieur de la boucle while, et il ouvre fondamentalement une nouvelle fenêtre chaque fois qu'il itère dans la boucle while
, et pour résoudre ce problème, vous pouvez mettre le plt.draw ()
en dehors de la boucle, puis interrompre la boucle lorsque vous voulez dessiner le graphique.
Merci pour votre réponse rapide!. Je veux que la fenêtre de tracé continue de mettre à jour le tracé jusqu'à ce que je le ferme. Quelle commande break me permettra cela?
@GanZo Vous pouvez essayer plt.clear ()
avant le plt.plot (...)
: source from cette question
malheureusement ce n'était pas ça
Vous recherchez un gestionnaire d'événements . L'événement que vous devez surveiller est la fermeture de la figure. Définissez la figure en dehors de la boucle infinie et ajoutez le gestionnaire d'événements:
import matplotlib.pyplot as plt def handle_close(evt): raise SystemExit('Closed figure, exit program.') fig = plt.figure() fig.canvas.mpl_connect('close_event', handle_close) while True: plt.text(0.35, 0.5, 'Close Me!', dict(size=30)) plt.show()
Cela change-t-il quelque chose si j'utilise "plt.schow ()" au lieu de "plt.draw ()"?
Ouais, c'est juste un exemple. Utilisez plt.draw () pour mettre à jour votre tracé.
Veuillez accepter / voter pour la réponse si elle a résolu votre question.
Désolé, je suis nouveau dans le codage. Je ne sais pas vraiment pourquoi. Mais cela n'a pas du tout changé le fonctionnement du programme. Peut-être qu'il doit y avoir une commande comme plt.close (fig)?
Oui, indentez simplement rise SystemExit ('Chiffre fermé, quittez le programme.')
correctement.
comme ça ? si tu veux dire ça, alors c'était juste une erreur ici pas dans mon code
il n'y a pas eu d'erreur. le problème était que chaque fois que j'essayais de fermer la fenêtre de tracé, elle ne cessait de s'ouvrir à nouveau ... aucune déclaration d'erreur
while True:
continuera à faire tout ce qui est à l'intérieur jusqu'à la fin de tous les jours. Ce n'est donc pas bien adapté à un flux de programme qui doit changer à tout moment. Au lieu de cela, vous voudrez introduire une condition qui doit être remplie pour que la boucle continue, while condition == True:
.
En termes de code, ce qui suit ne fonctionne que pour toujours p >
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() phi = 0 x = np.linspace(0,2*np.pi) y = np.sin(x) line, = ax.plot(x,y) def animate(i): phi = i/10 y = np.sin(x+phi) line.set_ydata(y) print(f"Still running; phi={phi}") ani = FuncAnimation(fig, animate) plt.show()
Nous devons donc introduire une condition pour ne pas continuer la boucle.
import numpy as np import matplotlib.pyplot as plt plt.ion() fig, ax = plt.subplots() phi = 0 x = np.linspace(0,2*np.pi) y = np.sin(x) line, = ax.plot(x,y) condition = True def on_close(evt=None): global condition condition = False fig.canvas.mpl_connect("close_event", on_close) while condition: phi += 0.1 y = np.sin(x+phi) line.set_ydata(y) plt.pause(0.1) print(f"Still running; phi={phi}") plt.ioff() plt.show()
C'est assez compliqué, donc matplotlib a un module d'animation intégré pour faire de même dans la boucle d'événements du programme.
import numpy as np import matplotlib.pyplot as plt plt.ion() fig, ax = plt.subplots() phi = 0 x = np.linspace(0,2*np.pi) y = np.sin(x) line, = ax.plot(x,y) while True: phi += 0.1 y = np.sin(x+phi) line.set_ydata(y) plt.pause(0.1) print(f"Still running; phi={phi}") plt.ioff() plt.show()
Ça y est ...! Merci