diff --git a/make_chart_from_csv.py b/make_chart_from_csv.py new file mode 100644 index 0000000000000000000000000000000000000000..a9b03957bb2402596256afe7941f0e9cfe439125 --- /dev/null +++ b/make_chart_from_csv.py @@ -0,0 +1,243 @@ +#!/bin/python3 + + +## Lizenz GPLv3 +## 2021, eschreiter + +## Program to read from csv files and show/create 2D and/or 3D charts and views from the data +# [ ] use parameters to choose csv file +# [v] use date/time from csv-file to create filenames for charts +# [v] heatmap output + + +#import visa +from time import sleep +import logging +import numpy as np # python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose +import matplotlib.pyplot as plt # python -mpip install -U matplotlib +from mpl_toolkits.axes_grid1 import host_subplot +import os +import datetime +import csv + +now = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')) + +path = './' # Pfad zum Speicherort +subdir = now # Unterordner pro Messung?, leer wenn nicht benötigt + +logging.basicConfig(format='%(asctime)s %(message)s') +logging.basicConfig(filename='log.txt', level=logging.DEBUG) +logging.info("START") + + +csv_Dateiname = get_youngest_file_in_folder() +print("Dteiname: ", csv_Dateiname) + + + +def Filter_liste(liste, suchtext): + # Sucht in einer Liste nach Dateien mit der Endung 'suchtext' + # z.B. Filter_liste(['datei.jpg','datei.txt'],'txt') + import os + neue_liste = list() + for eintrag in liste: + # Eintrag als Dateiname interpretieren, Endung ist Ende nach letzten Punkt + filename, file_extension = os.path.splitext(eintrag) + if suchtext in file_extension: + neue_liste.append(eintrag) + return neue_liste + + +def get_youngest_file_in_folder(): + ## Dateiname festlegen und öffnen + # jüngste brd Datei im aktuellen Verzeichnis wählen# + import os + verzeichnis = os.getcwd() + Inhalt_Pfad = os.listdir(verzeichnis) + Dateien_csv = Filter_liste(Inhalt_Pfad, "csv") + time = 0 + file = "" + + for Eintrag in Dateien_csv: + time_Eintrag = os.stat(Eintrag).st_mtime + if time == 0: + time = os.stat(Eintrag).st_mtime + file = Eintrag + if time_Eintrag > time: + time = time_Eintrag + file = Eintrag + # print(os.stat(Eintrag).st_mtime) + return file + + + +def schreibe_Messwerte_in_Datei(Dateiname, Messwerte, Liste_Winkel): + with open(Dateiname, 'w', newline='') as csvfile: + Messwerte_writer = csv.writer(csvfile, delimiter=';', + quotechar='\"', quoting=csv.QUOTE_MINIMAL) + + # Messwerte_writer = csv.writer(csvfile, dialect='excel') + # Messwerte_writer.writerows(['Spam'] * 5 + ['Baked Beans']) + # Messwerte_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) + Spaltennamen = "" + + Messwerte_writer.writerow(["Messung vom ", now]) + Messwerte_writer.writerow("") + Messwerte_writer.writerow(["Gemessene Winkel in Grad"]) + Messwerte_writer.writerow(Liste_Winkel) + Messwerte_writer.writerow("") + Messwerte_writer.writerow(["Hz", "s21", "rad", "s21", "rad", "..."]) + Messwerte_writer.writerow( + ["Frequenz", "Betrag_Winkel1", "Phase_Winkel1", "Betrag_Winkel2", "Phase_Winkel2", "..."]) + Messwerte_writer.writerows(Messwerte) + +def lies_Messwerte_aus_Datei(Dateiname): + global now + timestamp = now + with open(Dateiname, 'r', newline='') as csvfile: + Messwerte_reader = csv.reader(csvfile, delimiter=';', + quotechar='\"', quoting=csv.QUOTE_MINIMAL) + + # Messwerte_writer = csv.writer(csvfile, dialect='excel') + # Messwerte_writer.writerows(['Spam'] * 5 + ['Baked Beans']) + # Messwerte_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) + Spaltennamen = "" + Zeile = Messwerte_reader.__next__() + timestamp = str(Zeile[1]) + print("Datum der eingelesenen Messung: ", timestamp) #MessungMesswerte_writer.writerow(["Messung vom ", now]) + Messwerte_reader.__next__() # Messwerte_writer.writerow("") + Messwerte_reader.__next__() # Messwerte_writer.writerow(["Gemessene Winkel in Grad"]) + Liste_Winkel = np.array(Messwerte_reader.__next__()).astype(np.float32) #Messwerte_writer.writerow(Liste_Winkel) + Messwerte_reader.__next__() #Messwerte_writer.writerow("") + Messwerte_reader.__next__() #Messwerte_writer.writerow(["Hz", "s21", "rad", "s21", "rad", "..."]) + Messwerte_reader.__next__() #Messwerte_writer.writerow( + #["Frequenz", "Betrag_Winkel1", "Phase_Winkel1", "Betrag_Winkel2", "Phase_Winkel2", "..."]) + Messwerte = np.array(Messwerte_reader.__next__()).astype(np.float32) + print("Messwerte: ", Messwerte[0:10]) + Anzahl_in_Zeile = len(Messwerte) + print(Anzahl_in_Zeile) + for row in Messwerte_reader: + Messwerte = np.row_stack((Messwerte, np.array(row).astype(np.float32))) + #Messwerte.append(row) #Messwerte_writer.writerows(Messwerte) + print("Shape Messwerte: ", Messwerte.shape) + print("Shape Liste_Winkel: ", Liste_Winkel.shape) + return Messwerte, Liste_Winkel, timestamp + + + +def finde_index_fuer_Frequenz(Ziel_Frequenzen_MHz, Messwerte): + Frequenzen = Messwerte[:, 0] + indizes = list() + for Ziel_Frequenz in Ziel_Frequenzen_MHz: + indizes.append(np.argmin(abs(Frequenzen - (1000000 * Ziel_Frequenz)))) + # print(indizes) + logging.info("Index für Frequenz %s Hz ist %s" % (Ziel_Frequenz, indizes[-1])) + return indizes + + +def erstelle_Diagramm(Zeile, Liste_Winkel): + global timestamp + Daempfung = Zeile[1::2] # jedes 2. Element ab dem zweiten + Frequenz = Zeile[0] + Frequenz_MHz = Frequenz / 1000000.0 + Liste_Winkel_rad = Liste_Winkel / 180.0 * np.pi + plt.figure(figsize=(10, 10), dpi=100) + Bildname = os.path.join(path, timestamp + "_" + str(Frequenz) + '.png') + plt.polar(Liste_Winkel_rad, Daempfung, label="Pattern", color='blue') + plt.title('Frequenz %s MHz' % str(Frequenz_MHz)) + plt.savefig(Bildname) + logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz))) + # plt.show() + plt.close() + + +def erstelle_Diagramm_dB(Zeile, Liste_Winkel): + global timestamp + Daempfung = Zeile[1::2] # jedes 2. Element ab dem zweiten + Daempfung = 10 * np.log10(Daempfung) + Frequenz = Zeile[0] + Frequenz_MHz = Frequenz / 1000000.0 + Liste_Winkel_rad = Liste_Winkel / 180.0 * np.pi + plt.figure(figsize=(10, 10), dpi=100) + Bildname = os.path.join(path, timestamp + "_" + str(Frequenz) + '_dB.png') + plt.polar(Liste_Winkel_rad, Daempfung, label="Pattern", color='blue') + plt.title('Frequenz %s MHz' % str(Frequenz_MHz)) + plt.savefig(Bildname) + logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz))) + # plt.show() + plt.close() + +def heatmap(Messwert): + + import seaborn as sns #pip install seaborn + global Liste_Winkel, timestamp + plt.figure(figsize=(10, 10), dpi=100) + Bildname = os.path.join(path, timestamp + '_Heatmap.png') + ax = sns.heatmap(Messwert)#, linewidth=0.5) + plt.title("Dämpfung über Frequenz und Winkel") + plt.xlabel("Winkel in Grad") + plt.ylabel("Frequenz in MHz") + ax.set_xticklabels(Liste_Winkel[0::2]) + ax.set_yticklabels(Messwerte[0::8,0]/1000000) + plt.savefig(Bildname) + #logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz))) + #plt.show() + plt.close() + + +def heatmap_dB(Messwert): + + import seaborn as sns #pip install seaborn + global Liste_Winkel, timestamp + plt.figure(figsize=(10, 10), dpi=100) + Bildname = os.path.join(path, timestamp + '_Heatmap_dB.png') + ax = sns.heatmap(10 * np.log10(Messwert))#, linewidth=0.5) + plt.title("Dämpfung in dB über Frequenz und Winkel") + plt.xlabel("Winkel in Grad") + plt.ylabel("Frequenz in MHz") + ax.set_xticklabels(Liste_Winkel[0::2]) + ax.set_yticklabels(Messwerte[0::8,0]/1000000) + plt.savefig(Bildname) + #logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz))) + #plt.show() + plt.close() + + +# Messung machen +# +# +# +# # Datei speichern +# Dateiname = os.path.join(path, now + '.csv') +# +# schreibe_Messwerte_in_Datei(Dateiname, Messwerte, Liste_Winkel) + +############### +# Hier müsste es möglich sein alle Daten zu verwerfen, Messwerte.csv neu zu laden +# und die Darstellungen zu erzeugen!? +############### + +Messwerte, Liste_Winkel, timestamp = lies_Messwerte_aus_Datei(csv_Dateiname) + +print(Messwerte[0][0]) +print(type(Messwerte[0][0])) + +# Diagramme erstellen und speichern +# 800 MHz, ... + +# Ziel_Frequenzen_MHz = [860, 915, 2*860, 2*915, 2400, 2450, 2500] +# Ziel_Frequenzen_MHz = [145, 435, 500, 868, 916] + +Ziel_Frequenzen_MHz = [2400, 2440, 2480] +indizes = finde_index_fuer_Frequenz(Ziel_Frequenzen_MHz, Messwerte) + +heatmap(Messwerte[:,1::2]) +heatmap_dB(Messwerte[:,1::2]) + +for Zeile_gesucht in indizes: + # Zeile_gesucht = 14 + Zeile = Messwerte[Zeile_gesucht] + erstelle_Diagramm(Zeile, Liste_Winkel) + erstelle_Diagramm_dB(Zeile, Liste_Winkel) + +logging.info("ENDE")