Matplotlib/pyplot Hilfe

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
luis mikuszewski
User
Beiträge: 3
Registriert: Mittwoch 19. September 2018, 17:27

Guten Tag,
Ich habe kürzlich ein Projekt mit pyplot/matplotlib begonnen und habe das Problem dass der Plot nicht linear ist wie gewünscht. Die werte kommen Seriell vom Arduino und werden der Liste hinzugefügt nach einer anzahl von gesammelten werten wird die Liste im Plot angezeigt aber auf der y Achse sind die werten nicht von unten klein zu groß sondern "zufällig" verteilt. Ich würde mich sehr über Lösungsvorschläge wie man die y Achsen werte von klein zu groß sortiert freuen.
Bild
https://ibb.co/itSCzz

Sry für komische Fragestellung, schreibe selten in Foren

Vielen Dank für Antworten
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe die Frage nicht. Wenn dein Code so funktioniert wie du ihn beschreibst (aber nicht zeigst), dann ist x eine zeitachse. Und wenn dann Werte vom arduino einlaufen, die kleiner sind als ein Wert davor, dann ist das halt so. Was erwartest du, das da andres sein soll?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Ich denke es geht um die (schlecht zu lesende) Beschriftung der Y-Achse. Die Werte dort scheinen ungeordnet zu sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
luis mikuszewski
User
Beiträge: 3
Registriert: Mittwoch 19. September 2018, 17:27

Tut mir leid, habe vergessen den Code hinzuzufügen. Mein Ziel ist die "Zahlenbeschriftung" der y Achse zu sortieren von unten niedrigster Wert zu oben höherster Wert.

Bild
https://imgur.com/a/Zb56pR7
Sry nochmal wegen der Fragestellung

Code: Alles auswählen

import matplotlib.pyplot as plt
import serial
import numpy as np
import time
xar=[]

ser = serial.Serial('COM8', baudrate=115200)
count=0
predata=10000
rec=False
plt.style.use('seaborn-whitegrid')
while True:
    data=int(ser.readline().decode('ascii'))
    if(data>predata+10):
        if(rec==False):
            
            
            for x in range(100):
                data=ser.readline().decode('ascii')
                print(data)
                xar.append(data)
            rec=False
            
            plt.plot(xar)
           
            
            plt.show()
            break

    predata=data

if(rec==True):
    plt.plot(xar)
    plt.show()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

›if‹ ist keine Funktion, die Klammern daher unnötig. Da ›rec‹ nie True wird, kann man es auch gleich weglassen. Der innerste if-Block ist zu lang, als dass er sinnvoll in der while-Schleife wäre, da am Schluß sowieso immer die Schleife per break verlassen wird. ›xar‹ sollte dann initialisiert werden, wenn es auch benutzt wird und nicht 13 Zeilen davor. numpy und time wird importiert aber nicht verwendet. ›count‹ wird definiert aber nicht verwendet.

Code: Alles auswählen

import matplotlib.pyplot as plt
import serial

plt.style.use('seaborn-whitegrid')

def read_int(ser):
    return int(ser.readline().decode('ascii'))

ser = serial.Serial('COM8', baudrate=115200)
data = predata = read_int(ser)
while data < predata + 10:
    predata = data
    data = read_int(ser)

xar = []
for x in range(100):
    data = read_int(ser)
    print(data)
    xar.append(data)

plt.plot(xar)
plt.show()
Für Fragen, wie man in Matplotlib etwas macht, schaut man am besten in der Gallerie nach einem passenden Beispiel: https://matplotlib.org/gallery
z.B: https://matplotlib.org/examples/ticks_a ... ators.html
luis mikuszewski
User
Beiträge: 3
Registriert: Mittwoch 19. September 2018, 17:27

Vielen Dank für die schnelle Antwort und Problemlösung die Bibliotheken usw. waren noch Überreste von verschiedenen Lösungswegen. Leider hatte ich noch nicht sehr viel mit Python zu tuen weil ich erst 14 bin und wegen Schule und so nicht so viel Zeit habe.
Antworten