Python Live Plot aus .txt

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
Nocturor
User
Beiträge: 6
Registriert: Samstag 4. Juli 2020, 17:46

Hallo Leute,

ich versuche mich mit Python aus (Aus Spaß in meiner Freizeit) und versuche deswegen eine Meßtechnik für einen Sensor zu programmieren.
Ich habe zwei Probleme.

1) Ich habe das Problem, dass ich die Textdatei erst am Ende des Skriptes speichert und nicht bei jeder einzelnen Eintragung eines Messwertes. Ich dachte bei file.close speichert die Datei.
Allerdings aktuallisiert der Graph erst bei Abschluss der Eintragung aller Zahlen :/.

2) die vertikale Achse (y-Achse) zeigt die Werte nicht in richtiger Reihenfolge an. D.h. es steht eine 10 vor der 0. Ich dachte es könnte an der Speicherung als String liegen aber die Werte sind meiner Meinung nach Integer (INT)

Den Code startet man indem man zuert den Ersten Code ausführt und dann den Zweiten. Dafür bitte eine Text Datei erstellen mit dem Namen "aloha1.txt" im gleichen Verzeichnis.
Hier der Code1:

Code: Alles auswählen

from IPython import get_ipython
get_ipython().magic('reset -sf')
## clear all
##############################################################################
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
##############################################################################

plt.style.use('fivethirtyeight') 

data=open('aloha1.txt','r').read()
lines=data.split('\n')

def animate(i):
    data=open('aloha1.txt','r').read()
    lines=data.split('\n')
    x=[]
    y=[]
    for line in lines:
        if len(line) > 1:
            x1,y1 =line.split('\t')
            x.append(x1)
            y.append(y1)
            
    plt.cla()
    plt.plot(x,y,label='linie1')
    plt.legend(loc='upper left')
    

ani = FuncAnimation(plt.gcf(), animate, interval=1000)
plt.tight_layout()
plt.show()
Hier Code2:

Code: Alles auswählen

from IPython import get_ipython
get_ipython().magic('reset -sf')

import random
from itertools import count
from time import sleep

n=15 #wieviele neue zahlen
count=0 #um Anzahl der Zeilen zu bestimmen

z=int(input('willst du die datei zuruecksetzen y=1/n=0?'))#zurücksetzen
if z == 1:
    file3=open('aloha1.txt','w')
    file3.write('')
    file3.close()
    
file4=open('aloha1.txt','r')#anzahl der zeilen ermitteln count
with file4 as f:
    for line in f:
        count +=1

for new in range(count,count+n):#neue zahlen einschreiben
    if new == 0: #wenn es eine erste Zeile gibt kein \n am Anfang
        file=open('aloha1.txt','a')
        x1 = new
        y1 = random.randint(0,10)
        file.write('%.f\t%.f' %(x1,y1))
        file.close()
        
        file1=open('aloha1.txt','r') #dachte damit kann ich es speichern
        #read_lines= file1.readlines()
        #print(read_lines)
        file1.close()
        sleep(0)
    else:#wenn es keine zweite Zeile gibt \n am Anfang
        file=open('aloha1.txt','a')
        x1 = new
        y1 = random.randint(0,10)
        file.write('\n%.f\t%.f' %(x1,y1))
        file.close()
        
        file1=open('aloha1.txt','r') #dachte damit kann ich es speichern
        #read_lines= file1.readlines()
        #print(read_lines)
        file1.close()
        sleep(0)


Hier ist ein Beispiel wie es am Ende aussehen soll nur das die Werte aus einer Datei gezogen werden sollen(Hier ist die y Achse auch größenordnungsmäßig richtig):

Code: Alles auswählen

from IPython import get_ipython
get_ipython().magic('reset -sf')
## clear all
##############################################################################
import numpy as np
import matplotlib.pyplot as plt
import random
from itertools import count
from matplotlib.animation import FuncAnimation
from time import sleep
##############################################################################

x=[]
y=[]
z=[]

index = count()

plt.style.use('fivethirtyeight') 

def animate(i):
    x.append(next(index))
    y.append(random.randint(0,1))
    z.append(random.randint(0,1))
    plt.cla()
    plt.plot(x,y,label='linie1')
    plt.plot(x,z,label='linie2')
    plt.legend(loc='upper left')
    

ani = FuncAnimation(plt.gcf(), animate, interval=1)
plt.tight_layout()
plt.show()
Nocturor
User
Beiträge: 6
Registriert: Samstag 4. Juli 2020, 17:46

[Update] Ich konnte das zweite Problem mit der y-Achse lösen. Es war wie ich geahnt habe eine String liste.

Code: Alles auswählen

x.append(float(x1))
y.append(float(y1))
Bei der ersten Frage freue ich mich über Anregungen.
Nocturor
User
Beiträge: 6
Registriert: Samstag 4. Juli 2020, 17:46

[Update] Ich weiß jetzt was das Problem in der ersten Frage ist. Ich habe nun das Skript mit der Graphenerstellung über Python und das Skript für die Datenerstellung über die CMD-Konsole ausgeführt (Dort hat es wunderbar funktioniert). Anscheinend kann Python nicht zwei skripte gleichzeitig bearbeiten. Ich schätze es wird erst ein skript ausgeführt (das andere pausiert) und dann das andere. Eigentlich schade. Man hat doch mehrere Prozessorkerne für Multitasking.

Gibt es hierfür ein Workaround?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Diese Beobachtung stimmt nicht. Du kannst beliebig viele Skripte gleichzeitig laufen lassen. Irgendwann geht der Computer in die Knie, aber eine natürliche Beschränkung gibt es da nicht. Du hast da was eingebaut (unwissentlich, aber trotzdem), das dafür sorgt, dass da Dinge serialisert werden.
Nocturor
User
Beiträge: 6
Registriert: Samstag 4. Juli 2020, 17:46

__deets__ hat geschrieben: Mittwoch 8. Juli 2020, 09:24 Diese Beobachtung stimmt nicht. Du kannst beliebig viele Skripte gleichzeitig laufen lassen. Irgendwann geht der Computer in die Knie, aber eine natürliche Beschränkung gibt es da nicht. Du hast da was eingebaut (unwissentlich, aber trotzdem), das dafür sorgt, dass da Dinge serialisert werden.
Hallo __deets__, danke für deine Antwort. Kannst du mir sagen wo es genau zu Komplikationen kommt. Ich kann mir das leider nicht erklären (zu unerfahren mit Python).
Ich finde es trotzdem komisch, dass es sofort funktioniert wenn ich die Skripte in unterschiedlichen Programmen ausführe. Aber nicht im gleichen Programm.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur weil man zwei Programme in eine Datei kopiert, ist ihre Funktionalitaet nicht parallel ausgefuehrt. Gerade das es zwei Programme tun, aber dein ominoeses eines nicht, ist doch Beleg fuer das, was ich sage, und was du angezweifelt hast: das parallele Python Prozesse funktionieren.

Wenn du ein Programm haben willst, das zwei Dinge gleichzeitig macht, dann musst du das entsprechend Programmieren. ZB die Datenverarbeitung auch in den animate-Funktion machen, denn sonst steht das Programm im plt.show(), und das war's.
Antworten