Farbe und Form bei plots für einzelne files variieren

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
basti
User
Beiträge: 1
Registriert: Freitag 19. August 2011, 08:15

Hallo zusammen,

ich habe ein File aus dem ich 2 Blöcke auslese. Je ausgelesenem Block erstelle ich einen plot mittels pylab.plot. Mit der Option color kann in einem plot-Aufruf die Farbe festgelegt werden.
Nun möchte ich die gleiche Farbe für die beiden Blöcke verwenden. Wird ein neues File eingelesen soll eine andere Farbe verwendet werden. So soll dann ersichtlich sein, dass immer 2 Blöcke aus einem File kommen.
Lasse ich nun einfach die color-Option in den plot funktionen weg, so wird leider für jeden plot aufruf eine neue farbe verwendet. Das Programm soll aber erst die Farbe beim einlesen eines neuen files ändern.
Gleiches möchte ich dann noch mit den markern der plots machen, so dass man den Graphen später auch schwarz-weiß drucken kann.

hier mein ausschnitt aus dem code:

Code: Alles auswählen

for f in files:
    filename = f
    data = open(f, 'r')
    linenumber=0
    blockstart = 0
    blockende = 0
    for line in data.readlines():
        line = line.rstrip()
        linenumber = linenumber + 1
        if line.startswith('test'):
            jump.append(linenumber)
            blockstart = blockstart + 1
            test.write(line)
            test.write('\n')
    fileending = linenumber

        
    i = i + 2
    X1, Y1 = numpy.genfromtxt(filename,skip_header=jump[int(config.get("Files", "block_1"))] , usecols=(7,8),skip_footer = fileending - (jump[int(config.get("Files", "block_1"))+1]-(headersize-1)), unpack = True)
    pylab.plot(X1, Y1, label= filename)
    X2, Y2 = numpy.genfromtxt(filename,skip_header=jump[int(config.get("Files", "block_2"))] , usecols=(7,8),skip_footer = 0, unpack = True)
    pylab.plot(X2, Y2)

pylab.xlabel(config.get("Plots", "xlabel"))
pylab.ylabel(config.get("Plots", "ylabel"))
if config.get("Plots", "legend") == 'yes':
    pylab.legend(loc=config.get("Plots", "legend_position"))
Es wäre so cool, wenn ihr mir helfen könntet.

Gruß Basti
BlackJack

@basti: Wenn die beiden Datensätze mit gleichem Aussehen geplottet werden sollen, könntest Du doch einfach die Daten zusammen fassen und mit nur einem `plot()`-Aufruf zeichnen lassen!?

Anmerkungen zum Quelltext. `f` und `filename` stehen immer für den selben Wert, also sollte man eines von beiden loswerden. Am besten `f` denn einbuchstabige Namen sind oft nicht besonders aussagekräftig. `files` sollte demnach auch besser `filenames` heissen, denn der Name steht für Namen und nicht für Dateiobjekte. Ähnliches gilt für `data` was nicht für die Daten steht, sondern das Datei-Objekt aus dem die Daten gelesen werden.

`blockstart` ist auch irreführend. Es wird dort kein Blockstart gespeichert sondern anscheinend die Anzahl der gefundenen Blöcke gezählt. Die Information ist redundant, weil man ja die Länge der `jump`-Liste ermitteln kann, ausserdem werden weder `blockstart`, `blockende`, noch `i` wirklich verwendet.

Dateien muss man nicht mit `readlines()` komplett in eine Liste einlesen, wenn man diese Liste gar nicht wirklich benötigt. Man kann in einer ``for``-Schleife auch direkt über die Zeilen eines Datei-Objekts iterieren.

Wenn man zusätzlich zum iterieren über Elemente noch deren Index benötigt, muss man nicht ”per Hand” einen Zähler mitführen, sondern kann die `enumerate()`-Funktion verwenden.

Dateien die man öffnet, sollte man auch wieder schliessen. Die ``with``-Anweisung hilft dabei.
Antworten