Wie wähle ich eine neue Farbe für jede gezeichnete Linie innerhalb einer Figur in matplotlib aus?

109

Ich möchte NICHT für jede gezeichnete Linie eine Farbe angeben und jeder Linie eine eigene Farbe geben. Aber wenn ich renne:

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

dann bekomme ich diese Ausgabe:

Bild des durch den obigen Code ausgegebenen Diagramms

Wenn Sie sich das Bild oben ansehen, können Sie sehen, dass matplotlib versucht, Farben für jede Zeile auszuwählen, die unterschiedlich sind, aber schließlich Farben wiederverwendet - die oberen zehn Zeilen verwenden dieselben Farben wie die unteren zehn. Ich möchte nur verhindern, dass bereits verwendete Farben wiederholt werden und / oder eine Liste der zu verwendenden Farben eingefügt wird.

Dlamotte
quelle

Antworten:

59

matplotlib 1.5+

Sie können verwenden axes.set_prop_cycle( Beispiel ).

matplotlib 1.0-1.4

Sie können verwenden axes.set_color_cycle( Beispiel ).

matplotlib 0.x.

Sie können verwenden Axes.set_default_color_cycle.

tom10
quelle
1
Mehr nach dem, wonach ich gesucht habe ... Gibt es eine Möglichkeit, Informationen darüber hinzuzufügen, wie Sie mithilfe einer Farbkarte eine Liste mit N Farben erstellen können?
Dlamotte
19
@xyld - Um meine eigene Antwort nicht zu sehr einzustecken, aber es gibt ein Beispiel am Ende dieser Antwort: stackoverflow.com/questions/4805048/… Grundsätzlich tun Sie dies einfach : [colormap(i) for i in np.linspace(0, 0.9, num_plots)], wo colormapist eine der Farbkarten matplotlib.pyplot.cmund numplotsist die Nummer von einzigartigen Farben, die Sie wollen. Beachten Sie, dass dies zu Farben führen kann, die schwer voneinander zu unterscheiden sind !!
Joe Kington
4
Schöne Antwort, Joe, und es scheint Xylds Frage zu beantworten, also lasse ich es einfach dabei. Es ist jedoch auch erwähnenswert, dass es einige gute Antworten auf Fragen zum Generieren unterschiedlicher Farben gibt, wie zum Beispiel stackoverflow.com/questions/470690/…
tom10
Funktioniert es für jede Handlung? Ich habe set_prop_cycle auf Axes3D ausprobiert und dann die for-Schleife für mehrere Diagramme mit ax.plot_wireframe () verwendet, aber 2 Diagramme sind mit derselben Farbe gefärbt.
Joonho Park
112

Normalerweise benutze ich die zweite davon:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

Beispiel von 2: Beispielplot mit iter, nächste Farbe

Mark Amery
quelle
Ich habe # 2 benutzt. Ich habe eine Liste von Kanälen, die ich zeichnen muss, aber sie können unterschiedlich lang sein. Ich fand, dass die Einstellung n = len dieser Liste sehr hilfreich war, um sicherzustellen, dass die ausgewählten Farben den Bereich überspannen und Sie den Unterschied erkennen können. Wenn diese Zahl zu hoch ist, ist der Unterschied in den Farben schwer zu erkennen.
lila
Ich habe # 1 verwendet, es war nützlich, mit enumerate (list_name)
DevX
11

prop_cycle

color_cyclewurde in 1.5 zugunsten dieser Verallgemeinerung veraltet: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

Ebenfalls im (jetzt schlecht benannten) Beispiel gezeigt: http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html, erwähnt unter: https://stackoverflow.com/a/4971431/895245

Getestet in Matplotlib 1.5.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
9

Ich weiß nicht, ob Sie die Farbe automatisch ändern können, aber Sie könnten Ihre Schleife nutzen, um verschiedene Farben zu erzeugen:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

In diesem Fall variieren die Farben von Schwarz bis 100% Grün, aber Sie können sie einstellen, wenn Sie möchten.

Sehen Sie sich die Dokumente zu matplotlib plot () an und suchen Sie nach dem colorSchlüsselwortargument.

Wenn Sie eine Liste mit Farben füttern möchten, stellen Sie einfach sicher, dass Sie eine Liste haben, die groß genug ist, und verwenden Sie dann den Index der Schleife, um die Farbe auszuwählen

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])
Andrea Spadaccini
quelle
1
Ja, ich wollte so etwas irgendwie vermeiden. Ich habe mir Color Maps angesehen, bin aber ziemlich verwirrt, wie ich sie verwenden soll.
Dlamotte
Diese Lösung bietet keine einfache Möglichkeit, eine Farbkarte zu steuern
Ryszard Cetnarski
Dies ist sehr gut, insbesondere wenn set_prop_cycle fehlschlägt. Ich weiß nicht, warum set_prop_cycle oder das automatische Färben in plot_wireframe () in Axes3D fehlschlägt. Dies ist jedoch eine Art grundlegende / manuelle Lösung zum Färben.
Joonho Park
6

Sie können eine vordefinierte "qualitative Farbkarte" wie folgt verwenden:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

Getestet auf matplotlib 3.0.3. Unter https://github.com/matplotlib/matplotlib/issues/10840 finden Sie Informationen dazu, warum Sie nicht anrufen können axes.set_prop_cycle(color=cmap).

Eine Liste vordefinierter qualitativer Farbkarten finden Sie unter https://matplotlib.org/gallery/color/colormap_reference.html :

Liste der qualitativen Farbkarten

nyanpasu64
quelle
Beachten Sie, dass es die ersten 3 Farben nacheinander auf diesen nimmt
Ben Jones
2

Sie können auch den Standardfarbzyklus in Ihrer matplotlibrcDatei ändern . Wenn Sie nicht wissen, wo sich diese Datei befindet, gehen Sie in Python wie folgt vor:

import matplotlib
matplotlib.matplotlib_fname()

Dies zeigt Ihnen den Pfad zu Ihrer aktuell verwendeten matplotlibrc-Datei. In dieser Datei finden Sie neben vielen anderen Einstellungen auch die für axes.color.cycle. Geben Sie einfach die gewünschte Farbfolge ein und Sie finden sie in jedem Plot, den Sie erstellen. Beachten Sie, dass Sie in matplotlib auch alle gültigen HTML-Farbnamen verwenden können.

Thomasillo
quelle
0

Wie die Antwort von Ciro zeigt , können Sie prop_cycleeine Liste von Farben festlegen, durch die matplotlib durchlaufen soll. Aber wie viele Farben? Was ist, wenn Sie denselben Farbzyklus für viele Diagramme mit unterschiedlicher Anzahl von Linien verwenden möchten?

Eine Taktik wäre, eine Formel wie die von https://gamedev.stackexchange.com/a/46469/22397 zu verwenden , um eine unendliche Folge von Farben zu erzeugen, bei der jede Farbe versucht, sich signifikant von allen vorhergehenden zu unterscheiden.

prop_cycleAkzeptiert leider keine unendlichen Sequenzen - es bleibt für immer hängen, wenn Sie eine übergeben. Wir können jedoch beispielsweise die ersten 1000 Farben, die aus einer solchen Sequenz generiert wurden, als Farbzyklus festlegen. Auf diese Weise sollten Sie für Diagramme mit einer vernünftigen Anzahl von Linien unterscheidbare Farben erhalten.

Beispiel:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

Ausgabe:

Grafikausgabe mit dem obigen Code

Jetzt sind alle Farben unterschiedlich - obwohl ich zugebe, dass ich Schwierigkeiten habe, einige davon zu unterscheiden!

Mark Amery
quelle