Plots in einer Loop erzeugen

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
HelmutK
User
Beiträge: 4
Registriert: Mittwoch 27. November 2019, 19:12

Hallo liebe Python Community,

folgende Fragestellung: ich habe mehrere Datenlisten in einem Dict (dictionary) gepeichert, die ich nun gerne plotten würde. Dabei loope ich mittels dem Zähler "counter" durch.

Code: Alles auswählen

csv=0

while counter<csv:    

    fig1, ax1 = plt.subplots()
        
    ## Signal A plotten
    ax1.plot(dictionaryT[counter],dictionaryA[counter],color=next(colors), linewidth=0.5,zorder=1, label = "A")
    ax1.legend(loc="upper right",bbox_to_anchor=(1,1))
    ax1.grid(color='grey', linestyle='-', linewidth=0.5)
    ax1.axhline(0, color='black',linewidth=0.5)

    ## S plotten
    ax2 = ax1.twinx()
    ax2.plot(dictionaryT[0],dictionaryS[0],zorder=2,color=next(colors), linewidth=0.8,label = "S")
    ax2.set_ylabel('S')
    ax2.legend(loc="upper right",bbox_to_anchor=(1,0.95))


    fig1.tight_layout()

    counter=counter+1
Mein Ziel:
für jeden Loop ein neuen Plot erzeugen ODER eine neue figure Umgebung . Hierfür müsste ich quasi in jedem Loop: fig1, ax1 = plt.subplots() hochzählen (fig1, ax1 = plt.subplots() --- > fig2, ax1 = plt.subplots() )

Wisst Ihr was ich meine :-)

Viele Grüße
Helmut
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt Variablen hochzuzählen benutzt man eine Liste von Figures.
Statt einer while-Schleife benutzt man eine for-Schleife. Ein Objekt, auf das man über einen Index zugreifen kann, sollte nicht dictionaryX heißen, und auch kein Wörterbuch sein. Grunddatentypen sollten gar nicht im Namen vorkommen und T und A sollte noch sinnvoll benannt werden.

Code: Alles auswählen

figures = []
for some_t, some_a, color in zip(some_ts, some_as, colors):
    figure, axis = plt.subplots()
    axis.plot(some_t, some_a, color=colors, linewidth=0.5, zorder=1, label="A")
    figures.append(figure)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich hab mal versucht dein Problem nachzustellen:

Code: Alles auswählen

# Dieser Teil ist nur dazu da um Zufallszahlen, 
# die zu deinen Variablentypen und -name passen, zu erzeugen

import matplotlib.pyplot as plt
import random
dictionaryA = {}
dictionaryS = {}
dictionaryT = {}
for i in range(-2, 1):
    
    signalA = []
    signalS = []
    signalT = []
    for j in range(100):
        signalA.append(random.randint(0,10))
        signalS.append(random.randint(0,10))
        signalT.append(random.randint(0,10))

    dictionaryA[i] =signalA
    dictionaryS[i] =signalS
    dictionaryT[i] =signalS


def cols():
    for color in ['blue','green', 'red','cyan','magenta','blue','green', 'red','cyan','magenta']:
        yield color
colors = cols()
##########################################################################################



# dies währe dann mein Änderungsvorschlag
figures = []

for counter, (signalA, signalS, signalT) in enumerate(zip(dictionaryA.values(), dictionaryS.values(), dictionaryT.values()), -2):

    # die figures mit counter durch nummerieren
    fig1= plt.figure(counter)
    ax1 = plt.axes()
    fig1.add_axes(ax1)
        
    ## Signal A plotten
    ax1.plot(dictionaryT[counter],dictionaryA[counter],color=next(colors), linewidth=0.5,zorder=1, label = "A")
    ax1.legend(loc="upper right",bbox_to_anchor=(1,1))
    ax1.grid(color='grey', linestyle='-', linewidth=0.5)
    ax1.axhline(0, color='black',linewidth=0.5)

    ## S plotten
    ax2 = ax1.twinx()
    ax2.plot(dictionaryT[0],dictionaryS[0],zorder=2,color=next(colors), linewidth=0.8,label = "S")
    ax2.set_ylabel('S')
    ax2.legend(loc="upper right",bbox_to_anchor=(1,0.95))


    fig1.tight_layout()


plt.show()
Als Ausgabe bekomme ich drei unterschiedliche plots.

ABER
Wie Sirius3 schon schrieb:
Das Hochzählen aus dem negativen Bereich macht die Sache umständlicher als nötig
und statt Dictionaries würde ich verschachtelte Listen verwenden.

Falls du keinen Einfluss darauf hast wie dir dir Daten übergeben werden kannst du das natürlich nicht ändern.
Antworten