Datenpunkte unterhalb eines bestimmten Wert anders färben

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
Daniel W.
User
Beiträge: 12
Registriert: Dienstag 14. Juli 2020, 09:25

Hallo,

ich bin Python-Anfänger und habe ein Programm geschrieben, welches eine csv ausliest, dabei die relevanten Daten in Listen füllt und diese dann plottet. Ich möchte allerdings noch, die Punkte unterhalb von 35 rot gefärbt haben und bräuchte hierbei Hilfestellung.
Ja ich weiß, dass der Code mit den Hilfslisten und auch generell sicher deutlich eleganter geht. Aber so ist es eben am Anfang :D

https://ibb.co/XWtnP0v

Code:

Code: Alles auswählen

import csv
import matplotlib.pyplot as plt
import numpy as np
from math import*

#Listen erstellen
Spannung28=[]
Spannung282=[]
Datum28=[]
Datum282=[]
Spannung24=[]
Spannung242=[]
Datum24=[]
Datum242=[]
#GL28
with open("Keilzinken-Prüfung GL28.csv") as csvdatei:
    csv_reader_object = csv.reader(csvdatei, delimiter=';')

    zeilennummer = 0
    for row in csv_reader_object:
        if zeilennummer>2:
            if row[0]!='' and row [6]!='':
                Spannung28.append(row[6])
                Datum28.append(row[0])

        zeilennummer+=1

#listen format umwandeln
for i in Spannung28:
        a=float(i.replace(',','.'))
        Spannung282.append(a)
# GL24
with open("Keilzinken-Prüfung GL24.CSV") as csvdatei:
    csv_reader_object = csv.reader(csvdatei, delimiter=';')

    zeilennummer = 0
    for row in csv_reader_object:
        if zeilennummer>2:
            if row[0]!='' and row [6]!='':
                Spannung24.append(row[6])
                Datum24.append(row[0])

        zeilennummer+=1

#listen format umwandeln
for i in Spannung24:
        a=float(i.replace(',','.'))
        Spannung242.append(a)

print(len(Datum28))
print(len(Spannung28))
print(Datum28)
print(Spannung282)
print(Spannung242)

#Plot 28

fig = plt.figure(dpi=128, figsize=(14, 6))
plt.plot(Spannung282,"ob")
fig.autofmt_xdate()
plt.axhline(y=36, xmin=0, xmax=1,color="red", linestyle="--")
plt.title("Keilzinken-Biegeprüfung: GL28", fontsize=16)
plt.xlabel('Prüfkörperzähler')
plt.ylabel('Bruchspannung in N/mm²')
plt.tick_params(axis='both', which='major')
plt.tick_params(axis='both', which='major')
plt.show()

#Plot 24

fig = plt.figure(dpi=128, figsize=(14, 6))
plt.plot(Spannung242,"ob")
fig.autofmt_xdate()
plt.axhline(y=30, xmin=0, xmax=1,color="red", linestyle="--")
plt.title("Keilzinken-Biegeprüfung: GL24", fontsize=16)
plt.xlabel('Prüfkörperzähler')
plt.ylabel('Bruchspannung in N/mm²')
plt.tick_params(axis='both', which='major')
plt.tick_params(axis='both', which='major')
plt.show()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe. Es wird auch nichts aus math oder numpy gebraucht.
Variablennamen schreibt man komplett klein. Statt Code zu kopieren und leicht zu verändern, schreibt man Funktionen. Wenn man zu einer for-Schleife einen Index braucht, benutzt man enumerate. Du willst aber nur die ersten zwei Zeilen überlesen.
Variable initialisiert man dann, wenn man sie braucht, und nicht schon 30 Zeilen früher. Dann würde auch auffallen, dass einige Variablen gar nicht gebraucht werden.
Warum machst Du aus 28 eine 282? Hat die 28 nicht eine bestimmte Bedeutung?
Bei plt.scatter kannst Du für jeden Punkt eine Farbe angeben.

Code: Alles auswählen

import csv
import matplotlib.pyplot as plt

def read_spannung(filename):
    with open(filename) as csvdatei:
        rows = csv.reader(csvdatei, delimiter=';')
        # read three header lines
        _ = next(rows), next(rows), next(rows)
        spannung = []
        datum = []
        for row in rows:
            if row[0] != '' and row[6] != '':
                spannung.append(float(row[6].replace(',','.')))
                datum.append(row[0])
    return spannung, datum
    
def plot_spannung(title, spannung, datum, grenze):
    fig = plt.figure(dpi=128, figsize=(14, 6))
    plt.scatter(datum, spannung, color=["red" if s>grenze else "blue"])
    fig.autofmt_xdate()
    plt.axhline(y=grenze, xmin=0, xmax=1, color="red", linestyle="--")
    plt.title(title, fontsize=16)
    plt.xlabel('Prüfkörperzähler')
    plt.ylabel('Bruchspannung in N/mm²')
    plt.tick_params(axis='both', which='major')
    plt.tick_params(axis='both', which='major')
    plt.show()

spannung28, datum28 = read_spannung("Keilzinken-Prüfung GL28.csv")
spannung24, datum24 = read_spannung("Keilzinken-Prüfung GL24.csv")

plot_spannung("Keilzinken-Biegeprüfung: GL28", spannung28, datum28, 36)
plot_spannung("Keilzinken-Biegeprüfung: GL28", spannung24, datum24, 30)
Daniel W.
User
Beiträge: 12
Registriert: Dienstag 14. Juli 2020, 09:25

Vielen Dank für die sehr wertvollen Tipps und den Programm Vorschlag.

Allerdings gibt mir Pyhton eine Fehlermeldung raus:

Traceback (most recent call last):
File "C:/Users/Henfling/PycharmProjects/Henfling_Auswertung/Keilzinken hübsch.py", line 35, in <module>
plot_spannung("Keilzinken-Biegeprüfung: GL28", spannung28, datum28, 36)
File "C:/Users/Henfling/PycharmProjects/Henfling_Auswertung/Keilzinken hübsch.py", line 21, in plot_spannung
plt.scatter(datum, spannung, color=["red" if s > grenze else "blue"])
NameError: name 's' is not defined

Process finished with exit code 1

Er kennt wohl dieses "s" nicht.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Copy-nicht-paste-Fehler

Code: Alles auswählen

plt.scatter(datum, spannung, color=["red" if s>grenze else "blue" for s in spannung])
Daniel W.
User
Beiträge: 12
Registriert: Dienstag 14. Juli 2020, 09:25

Danke für die weitere Hilfe. Es funktioniert einwandfrei und meine zukünftigen Skripte werden durch die Verwendung von Funktionen übersichtlicher. :)

MfG

Daniel
Antworten