Matplotlib Diagramm direkt anzeigen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Sindrin
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 09:40

Hallo Zusammen

Ich arbeite zur Zeit an einem Projekt mit einem Pulssensor den ich am Raspberry Pi auslesen will.
Nin bin ich so weit und mein Programm erstellt mir nach 20 Messungen ein Diagramm welches auch gespeichert wird.
Nun meine Frage, wo muss ich den Befehl plot.show() einfügen damit das Diagramm auch sogleich geöffnet wird ?

#!/usr/bin/python
from pulsesensor import Pulsesensor
import time
import os
import pylab as plt
import sys

p = Pulsesensor ()
p.startAsyncBPM ()
Liste=[]
try:
for x in range(1,20):
bpm = p.BPM
if bpm > 0:
print("BPM: %d" % bpm)
Liste.append(bpm)
else:
print("No Heartbeat found")
time.sleep(1)
print ("Diagramm erstellen")

plt.ioff()


fig = plt.figure()



plt.plot(Liste)
plt.savefig('test0.png')
plt.close(fig)
plt.show()
print ("Fertig")
p.stopAsyncBPM()
except:
p.stopAsyncBPM()



sys.exit()
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Zu Deinem Code schreibe ich jetzt nichts, außer dass der sich besser lesen würde, wenn Du den in Code-Tags gesetzt hättest ("Code auswählen"). Doch ob man da einiges besser hätte schreiben können, da bin ich mir nicht so sicher.
Wenn das Ergebnis mit 'test0.png' richtig gespeichert wird, warum setzt Du die Ausgabe nicht gleich darunter, statt zuvor mit close zu schließen? Also, wenn close erforderlich, dann doch eher in dieser Reihenfolge, würde ich mir denken.

Code: Alles auswählen

plt.show()
plt.close(fig)
Sindrin
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 09:40

Hallo Melewo

Danke für deine Antwort und entschuldige das ich den Code nicht richtig eingefügt habe. Bin neu hier.
Ich habe meinen Code noch etwas umgeschrieben

Code: Alles auswählen

#!/usr/bin/python
from pulsesensor import Pulsesensor
import time
import os
import matplotlib
import matplotlib.pyplot as plt


import sys

p = Pulsesensor ()
p.startAsyncBPM ()
Liste=[]
try:
    for x in range(1,20):
        bpm = p.BPM
        if bpm > 0:
            print("BPM: %d" % bpm)
            Liste.append(bpm)
        else:
            print("No Heartbeat found")
        time.sleep(1)
    print ("Diagramm erstellen")
    p.stopAsyncBPM()
    plt.ioff()


    fig = plt.figure()



    plt.plot(Liste)
    plt.xlabel("Messung")
    plt.ylabel("Schlaege/Minute")
    plt.title("Auswertung Pulssensor")
    plt.grid(True)


    plt.savefig('Diagramm.png')
    plt.show()

    print ("Fertig")
    p.stopAsyncBPM()
except:
    p.stopAsyncBPM()



sys.exit()
Nun hab ich aber das nette Problem, dass es mir das png einwandfrei speichert die Funktion show nicht funktioniert. Dass heisst es geht leider kein Fenster auf, welches das Diagramm anzeigt.

Vielleicht hatte jemand das Problem schon und kann mir Helfen ? ich arbeite auf einem Mac.

Danke :)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Wenn ich mir example.py betrachte, fällt mir als erstes auf, dass Du "p.stopAsyncBPM()" zweimal innerhalb von try benutzt, was mindestens einmal zu viel sein dürfte.

https://github.com/tutRPi/Raspberry-Pi- ... example.py

Dann trenne beides, notiere nur den Pulsesensor mit allem was dazugehört in eine Funktion, welche mit return die Liste liefert und was zum Plot gehört in eine andere Funktion, welche die Liste übernimmt und den Plot aufbereitet. Dann hast Du beides getrennt und kannst leichter nach einem Fehler suchen. Wo hast Du das mit dem "sys" jetzt her, braucht man das?

Die beiden scheinen zumindest über zu sein, sehe keine Verwendung.

Code: Alles auswählen

import os
import matplotlib
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ob dieses "plt.ioff()" bei Deinem Script sinnvoll ist oder nicht, daran habe ich gerade auch noch meine Zweifel, nachdem ich die Beschreibung las.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sindrin: das try-except so wie es gerade dasteht ist falsch. Was Du eigentlich benutzen willst, ist try-finally und nur im finally-Block steht `p.stopAsyncBPM()`. sys.exit in der letzten Zeile ist sinnfrei; weg damit.
Du verwendest offensichtlich Python2, da gehören entweder keine Klammern um `print` oder ein __future__-Import.

Der Code ist zu lang. Du solltest zwei Funktionen schreiben, eine zum Lesen des Pilsesensors und eine zum Ausgeben des Diagramms.

Code: Alles auswählen

#!/usr/bin/python
from __future__ import print_function
import time
import os
import matplotlib
import matplotlib.pyplot as plt
from pulsesensor import Pulsesensor

def read_pulse_sensor(times=19):
    result = []
    p = Pulsesensor()
    p.startAsyncBPM()
    try:
        for _ in range(times):
            bpm = p.BPM
            if bpm > 0:
                print("BPM: %d" % bpm)
                result.append(bpm)
            else:
                print("No Heartbeat found")
            time.sleep(1)
    finally:
        p.stopAsyncBPM()
    return result

def display_and_save_diagram(measurement, filename):
    print ("Diagramm erstellen")
    plt.plot(measurement)
    plt.xlabel("Messung")
    plt.ylabel("Schlaege/Minute")
    plt.title("Auswertung Pulssensor")
    plt.grid(True)
    plt.savefig(filename)
    plt.show()
    print ("Fertig")
    
def main():
    measurement = read_pulse_sensor()
    display_and_save_diagram(measurement, 'Diagramm.png')

if __name__ == '__main__':
    main()
Sindrin
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 09:40

Hallo Zusammen

Erstmals vielen Dank für eure Hilfe.

Ich hab das Programm mal getestet, aber die Funktion show will immer noch nicht. Alles funktioniert einwandfrei, aber es zeigt mir nicht den plot an.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Und das 'Diagramm.png' wird sauber gespeichert?
Dann muss ich passen, denn wenn ich nur die untere Funktion nehme und für einen Test eine Liste einfüge, dann funktioniert die unter Windows einwandfrei bei mir. Doch mit plt.show() sollte wohl Raspberry Pi auch keine Probleme haben, jedenfalls habe ich dazu nichts gefunden, außer einem Hinweis auf Versionsgerangel.

Code: Alles auswählen

import matplotlib.pyplot as plt

def display_and_save_diagram(measurement, filename):
    print ("Diagramm erstellen")
    plt.plot(measurement)
    plt.xlabel("Messung")
    plt.ylabel("Schlaege/Minute")
    plt.title("Auswertung Pulssensor")
    plt.grid(True)
    plt.savefig(filename)
    plt.show()
    print ("Fertig")

def main():
    measurement = [50, 51, 52, 53, 54, 58, 60, 62, 64, 60, 58]
    display_and_save_diagram(measurement, 'Diagramm.png')

if __name__ == '__main__':
    main()
Sindrin
User
Beiträge: 4
Registriert: Sonntag 10. September 2017, 09:40

Ja das png wird sauber mit Benennung gespeichert und ich kann es via Filezilla problemlos öffnen.

Ich denke mir bleibt nichts andere möglich als eventuell mal meinen Raspberry neu aufzusetzen, vielleicht löst das den Bug.

Ich hab noch in einigen anderen Foren gelesen, das man den Backend für Mac ändern muss. Aber das hat auch nicht funktioniert.
Antworten