Seite 1 von 1

Datenpunkte unterhalb eines bestimmten Wert anders färben

Verfasst: Mittwoch 9. September 2020, 08:11
von Daniel W.
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()

Re: Datenpunkte unterhalb eines bestimmten Wert anders färben

Verfasst: Mittwoch 9. September 2020, 09:04
von Sirius3
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)

Re: Datenpunkte unterhalb eines bestimmten Wert anders färben

Verfasst: Donnerstag 17. September 2020, 10:25
von Daniel W.
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.

Re: Datenpunkte unterhalb eines bestimmten Wert anders färben

Verfasst: Donnerstag 17. September 2020, 10:51
von Sirius3
Copy-nicht-paste-Fehler

Code: Alles auswählen

plt.scatter(datum, spannung, color=["red" if s>grenze else "blue" for s in spannung])

Re: Datenpunkte unterhalb eines bestimmten Wert anders färben

Verfasst: Montag 21. September 2020, 15:21
von Daniel W.
Danke für die weitere Hilfe. Es funktioniert einwandfrei und meine zukünftigen Skripte werden durch die Verwendung von Funktionen übersichtlicher. :)

MfG

Daniel