Blockierung plot.show()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
elminer
User
Beiträge: 2
Registriert: Samstag 8. Juli 2017, 22:25

Nach 6 Stunden erfolglosen scribten habe ich mich dazu entschlossen einen Account für dieses Forum zu erstellen und um Hilfe zu bitten.
Als Anfänger habe ich mich das erste mal an grafische Ausgaben mit Hilfe von Python gewagt.
Nun habe ich leider ein kleines, mittelgroßes Problem:
Zuerst lese ich Werte von einem USB Gerät aus, dass klappt schon einmal bis hier hin.
Danach soll sich mit Hilfe von Matplotlib ein Balkendiagramm öffnen in dem die Werte angezeigt werden.
Balkendiagramm öffnet sich und die Werte werden angezeigt, aber das Programm läuft nach plot.show() nicht weiter.
eigentlich sollte die Schleife nach einer Wartezeit von vorne Anfangen, also Werte auslesen und neues Diagramm zeichnen, ggf. die Werte im Balkendiagramm nur aktualisieren? Vielleicht kann mir jemand helfen. LG elminer
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Matplotlib ist nicht so richtig gedacht für solche Zwecke. Auch wenn man es dahin kriegen kann, ist das ein bisschen fummelig und meines Wissens nach auch einfach ein neu zeichnen der Plots, kein echtes update.

Es gibt neuere Frameworks die solche Anwendungen berücksichtigen. Schau dir mal plotly oder bokeh an.

Allgemein ist eine solche Programmierung aber nicht ganz einfach. Man muss sich üblicherweise mit einer Ereignisschleife auseinandersetzen, und seinen Code entweder in Häppchen aufteilen, oder nebenläufig laufen lassen & dann geeignet in die Hauptschleife schieben. Am besten zeigst du mal was du machst - dann kann man das besser beurteilen.
elminer
User
Beiträge: 2
Registriert: Samstag 8. Juli 2017, 22:25

Hier ist noch mein Code, erstmal ohne Schleife.
Das Problem: print-Befehl wird nicht ausgeführt da der Code bei plot.show() hängen bleibt.
Danke für den Tipp werde mich gleich mal informieren.
Nutze zur Zeit noch feste Werte zum zeichnen des Balkendiagramms, sollen später durch Variablen ersetzt werden.
LG elminer
Code:

Code: Alles auswählen

print "It works"
import time
import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import sys
import multiprocessing
import matplotlib.pyplot as plt
import matplotlib as mpl
from dronekit import connect
from matplotlib.pyplot import plot, draw, show

vehicle = connect ('/dev/ttyACM0', wait_ready=True)
x = 0
answer = raw_input("Enter something") 
def make_plot():
	objects = ('Pitch', 'Jaw', 'Roll')
	y_pos = np.arange(len(objects))
	performance = [0.8,0.053,-0.14]
	plt.bar(y_pos, performance, align='center', alpha=0.5)
	plt.xticks(y_pos, objects)
	
	plt.ylabel('Values')
	plt.title('Flightdata')
	plt.show()
	plt.pause(0.01)
	print " Attitude: %s" % vehicle.attitude
	time.sleep(5)

make_plot()
Zuletzt geändert von Anonymous am Sonntag 9. Juli 2017, 12:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier ist ein Beispiel, bei dem illustriert wird wie der Zugriff auf Daten in einem Thread erfolgt.

http://bokeh.pydata.org/en/latest/docs/ ... om-threads
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Hallo, habe vor einiger Zeit eine ähnliche Frage gestellt und habe feststellen müssen, dass "plot" nicht geeignet ist, um z.B. Fortschritte in einer Schleife zu zeigen. Plot bleibt nicht "hängen", es erwartet schlicht, dass das Fenster vom User geschlossen wird. Erst dann gehts wieder weiter.
Das Beispiel von __deets__ kann ich kaum nachvollziehen. Bin auch Anfänger...
Habe aber gute Beispiele in PyQt5 gefunden. Danach würde ich graphisches Widget erzeugen, in das die Werte nach und nach eingeschrieben werden. Allerdings ist auch PyQt5 nicht trivial und ich habe bisher noch keinen "Durchbruch" gehabt.
Vielleicht ist das aber trotzdem auch ein Weg für dich.
Viel Erfolg und Gruß
Antworten