Arrays plotten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mf90
User
Beiträge: 3
Registriert: Montag 9. Oktober 2017, 11:29

Hallo zusammen!

Ich heiße Markus und schreibe im Moment meine Bachelorarbeit. Hierfür benötige ich ein Python-Skript, das eine Datei ausließt und gewisse Werte speichert. Diese Werte möchte ich anschließend in einem Liniendiagramm plotten und als Bild abspeichern.
Meine beiden Programmteile, also das Auslesen der Datei und Abspeichern der Werte, sowie das Plotten eines Diagramms funktionieren bisher unabhängig voneinander.
Nun habe ich das Problem, dass ich beim Zusammenfügen der beiden Programmteile keinen Plot erhalte.
Klingt vllt etwas verwirrend aber hier ist ein Minimalbeispiel dazu:

Dazu möchte ich noch erwähnen, dass ich den ersten Teil, also das Auslesen der Datei mittels PyCharm kontrolliert habe.
Die Ausgabe von PyCharm werde ich einfach im Programmbeispiel einfügen und kennzeichnen.
Das Plotten hat in PyCharm nicht funktioniert da ich keine Möglichkeit habe die Packages zu integrieren.
Es hat aber in einem anderen Programm, in welchem das Skript letztendlich auch laufen soll, funktioniert. Dort habe ich separate
Variablen übergeben.

--------------------------------------------------------------------------------------

Code: Alles auswählen


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



# function must be named 'func'

def func():                 # Das Skript wird später von einem anderen Programm verwendet, dazu gehört  das "def func():"
 
                .
                .
                .
                .
                . # hier wird die Datei ausgelesen und die Werte in die untenstehenden Variablen geschrieben
                .
                .
                .
                .  
 
 #ruhestrom = []             # Array mit den Ruhestromwerten
 #zeit = []                      # Array mit den Ruhestromzeiten
 #max_t = max(zeit)             # Gesamtmessdauer
 #max_I = max(ruhestrom)    # maximaler Ruhestrom
 #t_maxI = zeit[index]          # Zeitpunkt des maximalen Ruhestroms


# PyCharm gibt mir nach einem Print der Variablen, die Werte folgendermaßen aus (in Reihenfolge der oberen Variablennamen):
#       [72.601, 72.493, ...] # hier stehen noch mehrere Werte drin
#       [0.075613215591812, 0.2689515619894, ...]
#       350.970061064
#       75.155
#       122.464918764


# ---------------------------------------------------------------------------------------------------------
# ############ Diagramm erstellen ####################
# ----------------------------------------------------------------------------------------------------------

# Achsengroesse des Diagramms angeben
    plt.axis([0, max_t*1.3, 0, max_I*1.3])  # x_min, x_max, y_min, y_max
    plt.grid(True)  # Raster im Diagramm hinterlegen



# Label fuer die x-,y-Achse vergeben:
    plt.title('Ruhestrommessung', fontsize=25, color='gray')
    plt.xlabel('Messdauer [t/s]')
    plt.ylabel('Ruhestrom [I/mA]')
    
# x-y-Plot erstellen:   
    plt.plot(zeit, ruhestrom, color='red', linewidth=1, linestyle='-')
    
# Vertikale gestrichelte Linie an der Stelle 'MaxRuhestrom' einzeichnen
# (von der x-Achse bis zum maximalen Ruhestrom):
    plt.plot([t_maxI, t_maxI], [0, max_I], color='red', linewidth=0.5, linestyle="--")
    
# Horizontal gestrichelte Linie an der Stelle 'MaxRuhestrom' einzeichnen
# (von der y-Achse bis zum maximalen Ruhestrom):
    plt.plot([0, t_maxI], [max_I, max_I], color='red', linewidth=0.5, linestyle="--")
    
# Maximalen Wert des Ruhestroms mit Marker versehen:
# (Die x- und y-Werte muessen -- wie bei plot() -- als Liste angegeben werden)
# (Mit s=50 wird die Groesse ('size') auf 50 Pixel festgelegt)
    plt.scatter([t_maxI], [max_I], s=50, marker='o', color='red')
    

    
#Das Achsen-Objekt des Diagramms in einer Variablen ablegen:
    ax = plt.gca()
      
    
# Die obere und rechte Achse unsichtbar machen:
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')

    
# Speichern als PNG-Datei: 
    plt.savefig('P:/.../Ruhestrommessung.png')
   
    


    pass

---------------------------------------------------------------------------------


Führe ich das Skript in meinem Programm aus, erhalte ich keine PNG-Datei im genannten Pfad.
Das Programm verfügt über keinen debugger, somit kann ich den Fehler auch kaum lokalisieren.
Vllt sieht der ein oder andere den Fehler bzw. das Problem und kann mir helfen?


Schöne Grüße

Markus
Zuletzt geändert von mf90 am Montag 9. Oktober 2017, 15:52, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutz die Code-tags hier im Forum um deinen Quelltext so zu formatieren das man den auch entziffern kann.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich find das sehr verwirrend, und wirklich ein Minimalbeispiel ist es nicht - das impliziert ausfuehrbarkeit.

Und genau da wuerde ich auch ansetzen. Bau dein Skript so auf, dass es *wirklich* minimal ist, und nur einen Testplot erzeugt & speicher.

Erweitere das dann sukzessive aus deinen existierenden Codeschnipseln bis es geht.

Wenn pycharm dir in die Quere kommt, benutz einfach eine Shell und starte das Programm von da.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@mf90: was heißt "Führe ich das Skript in meinem Programm aus"? Wie führst Du das aus? Das was Du zeigst ist kein Skript, sondern nur eine Funktionsdefinition.
mf90
User
Beiträge: 3
Registriert: Montag 9. Oktober 2017, 11:29

Das Programm ist ein firmeninternes Tool zur Testautomatisierung, welches hauptsächlich symbolbasierend arbeitet. Für spezielle "Spielereien" wie Auslesen einer Datei können in diesem Programm Variablen erstelllt werden, die als python function agieren. Sprich ich kopiere mein Skript in diese variable als "def func ():" und
beim Ausführen der Automatisierung wird es dementsprechend interpretiert. Die Funktion wird durch den Aufruf der Variable also ausgeführt. Etwas strange aber so funktioniert das Tool.

Danke schonmal für die Rückmeldung __deets__ !
Werde es morgen noch einmal probieren
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@mf90: es hört sich seltsam an, dass diese Testumgebung nirgends Exceptions logged. Das ist ja das mindeste, um überhaupt Fehler zu finden. Notfalls kann man das aber selbst in die Funktion schreiben und Exceptions in eine Datei ausgeben lassen.
mf90
User
Beiträge: 3
Registriert: Montag 9. Oktober 2017, 11:29

Servus Zusammen!

Habe den/die Fehler endlich gefunden! :D

1.

Code: Alles auswählen

plt.axis([0, max_t*1.3, 0, max_I*1.3])  # x_min, x_max, y_min, y_max
habe die Grenzen max_t*1.3 und max_I*1.3 in neue Variablen geschrieben und diese dem Plot-Befehl übergeben.

2. Ich hatte einen Syntaxfehler in dem Automatisierungstool. Dabei habe ich einfach nur zwei Klammern vergessen. :roll:

Wie ich schon beschrieben habe liegt in meiner Variablen (Nennen wir sie mal "Messung") mein Quellcode in einer def func():.
Nun muss ich die Variable natürlich mit "Messung()" aufrufen um die Funktion auch auszuführen. Hier habe ich die Klammern vergessen.


Danke für eure Hilfe!!! :)
Antworten