Plot: 24 verschiedene Farben automatisch wählen

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
KomplexKompliziert
User
Beiträge: 20
Registriert: Freitag 29. Juni 2012, 09:05

Hallo zusammen!
Das Python-Forum ist echt super -wollte euch nur nochmal loben!
Also heute habe ich folgendes Problem:
Ich möchte eine Grafik erstellen, in der 24 verschiedene Funktionen eingezeichnet werden sollen. Jede Funktion soll eine andere Farbe bzw. ein anderes Symbol erhalten. Wenn ich es wie folgt implementiere, wiederholt Python die Farben irgendwann wieder (i,j sind die Bezeichnungen der Funktionen)

Code: Alles auswählen

i=[0, 1, 1, 2, 2, 4, 5, 5, 6, 6, 7, 7, 9, 9, 10, 10, 11, 11, 13, 14, 18, 19, 20, 21]
j=[1, 2, 4, 3, 4, 5, 6,9, 7, 17, 8, 19, 10, 20, 11, 16, 12, 14, 14, 15, 19, 20, 21, 22]
for m in range(0,23):
	ax.plot(time,D[m,:],label='D'+str(i[m])+','+str(j[m]))

Die Funktionen haben einen zufälligen Startwert und konvergieren dann gegen 0 oder 1. Wichtig ist nur, dass man am Anfang unterscheiden kann, welche Funktion konvergiert gegen 0, welche gegen 1. Dass am Ende alles übereinander liegt (also entweder auf 0 oder 1), ist gewollt.
Hat jemand eine Idee, wie ich das realisieren kann?

Dann habe ich noch eine zweite Frage zu obigem: Ich möchte, dass in der Legende steht D1,2. Also dass die Zahlen als Indizes dastehen. Ist das möglich?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Erstmal solltest du deinen Code zusammenfassen. Dann iterierst du nämlich auch über alle 24 Indices und nicht nur über die ersten 23.

Code: Alles auswählen

is_ = [0, 1, 1, 2, 2, 4, 5, 5, 6, 6, 7, 7, 9, 9, 10, 10, 11, 11, 13, 14, 18, 19, 20, 21]
js = [1, 2, 4, 3, 4, 5, 6,9, 7, 17, 8, 19, 10, 20, 11, 16, 12, 14, 14, 15, 19, 20, 21, 22]
for m, (i, j) in enumerate(zip(is_, js)):
    ax.plot(time,D[m,:],label='D_{%d,%d}' % (i, j))
Gegen wie Wiederholungen der Farben bis du recht machtlos, da musst du dir selber etwas überlegen. Entweder sammelst du selber 24 unterscheidbare Farben, aber ich kann mir ehrlich nicht vorstellen, wie man 24 Farben unterscheiden sollte. 24 Graphen sind in einem Plot einfach zu viel. Statt 24 Farben könntest du auch unterschiedlichen Typen von Linien verwenden. Durchgezogen, gestrichelt, gepunktet, etc. Bei vier Linientypen brauchst du dann auch nur noch sechs Farben.

Zu der Beschriftung der Legende: du kannst dort beliebigen LaTeX-Code verwenden.
Das Leben ist wie ein Tennisball.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@ KomplexKompliziert: Du kannst bei ``plot`` das Schlüsselwort ``color`` angeben. Die Farben kannst du dir z.B. von einer ``colormap`` geben lassen. Hier ein recht einfaches Beispiel:

Code: Alles auswählen

In [5]: x = np.linspace(0,2*pi)

In [6]: y = lambda phi: np.sin(x+phi)

In [7]: phis = np.linspace(0,1,24)

In [8]: for phi in phis:
   ...:     plt.plot(x, y(phi), color=cm.jet(phi))
   ...:   
Grüße
Gerrit
Antworten