Funktionen und Ableitung in einer Figure, ggf. Alternative zu plt.subplots()

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
sanjo386
User
Beiträge: 7
Registriert: Samstag 4. März 2017, 11:47

Hallo liebe Leute,

ich gehe gerade in die Oberstufe und habe in der Freizeit etwas mit Python angefangen. Das meiste habe ich mir durch Recherchen im Internet angeeignet, aber irgendwie komme ich gerade ohne Hilfe nicht weiter. Ich möchte gerne eine Kurvendiskussion in Python programmieren und die Ergebnisse plotten. Ganz konkret geht es darum, dass ich die Funktionen (hier werden verschiedene Textdateien eingelesen) und deren Ableitungen in einem Plot auf zwei verschiedenen y-Achsen darstellen möchte. Hier kam ich mit den einfachen Befehlen wie plt.figure(), etc. nicht weiter, weshalb ich auf spines und ticks umsteigen musste (was mir ehrlich gesagt nicht ganz einfach gefallen ist, da die Vielfalt für mich als Anfänger hier sehr groß erscheint). Jetzt erhalte ich zwar zwei y-Achsen in einem Diagramm, leider werden die Daten aus unterschiedlichen Dateien jetzt nicht mehr in einer Figure, sondern in jeweil einer getrennten dargestellt (trotz for-schleife, die bisher genau den Sinn hatte, das Ergebnis aus beiden Textdateien in einer Figure darzustellen). Ich vermute das "Problem" in plt.subplots() der immer eine neue Figure öffnet. Ich habe es mal mit plt.figure() versucht, leider ist dies aber "not iterable".

Hilfe wird dankend angenommen :D?

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

PATHS = ["C:\Desktop\\1sinx.txt",
        "C:\Desktop\\2sin2x.txt"]

##############Daten einlesen##############
def read(PATH):
    a, b = np.loadtxt(PATH, unpack = True)
    return a, b

##############Daten bearbeiten##############

for i in range(len(PATHS)):
    x, y = read(PATHS[i])

    dx = np.gradient(x)
    dy = np.gradient(y)
    dydx = dy/dx

    fig1, ax1 = plt.subplots()
    ax1.plot(x, y)
    ax1.set_xlabel('x [a.u.]')
    ax1.set_ylabel('y [a.u.]', color = 'b')
    ax1.tick_params('y', colors = 'b')

    ax2 = ax1.twinx()
    ax2.plot(x, dydx, 'r')
    ax2.set_ylabel('dydx [a.u.]', color = 'r')
    ax2.tick_params('dydx', colors = 'r')
    fig1.tight_layout()

plt.show()
PS.: Bei Bedarf kann ich auch die Daten für die Kurvendiskussion reinstellen, ich sah gerade auf die Schnelle nicht, wie man Textdateien hochladen kann.

Vielen Dank vorab und Gruß
Sanjo
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 12:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Verschiebe die Zeilen

Code: Alles auswählen

fig1, ax1 = plt.subplots()
ax2 = ax1.twinx()
vor die Schleife.
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@sanjo386: Wenn Du nicht für jeden Datensatz einen Subplot erstellen möchtest, dann erstelle halt nicht für jeden Datensatz einen Subplot. ;-) Sachen in Schleifen werden so oft gemacht wie die Schleife durchlaufen wird. Wenn Du etwas nur einmal für alle Schleifendurchläufe machen möchtest, dann darf das offensichtlich nicht *in* der Schleife stehen.

Man sollte auch direkt über `PATHS` iterieren und nicht den unnötigen Umweg über einen Index nehmen. Ausserdem sollte man keine Namen nummerieren sondern vernünftige Namen wählen, oder keine einzelnen Namen sondern eine Datenstruktur. In diesem Fall sind es keine passenden Namen. Die 1 bei `fig1` kann weg, denn es gibt ja nur diese eine (momentan zur gleichen Zeit, im korrigierten Programm dann wirklich nur eine), und bei `ax1` und `ax2` wären Namen besser die dem Leser verraten was die Achsen jeweils bedeuten. Also beispielsweise `function_axis` und `derivative_axis` oder so.
sanjo386
User
Beiträge: 7
Registriert: Samstag 4. März 2017, 11:47

@MagBen: Vielen Dank :)!

@BlackJack: Auch danke für die Hinweise, klingt logisch :D.
Antworten