Standard-Linienfarbzyklus abrufen

92

Ich habe beim Zeichnen festgestellt, dass die erste Zeile blau, dann grün, dann rot und so weiter ist.

Gibt es eine Möglichkeit, auf diese Liste von Farben zuzugreifen? Ich habe eine Million Beiträge darüber gesehen, wie man den Farbzyklus ändert oder auf den Iterator zugreift, aber nicht, wie man nur die Liste der Farben erhält, die matplotlib standardmäßig durchläuft.

Peter
quelle

Antworten:

114

In matplotlib Versionen> = 1.5 können Sie drucken die rcParamgenannt axes.prop_cycle:

print plt.rcParams['axes.prop_cycle'].by_key()['color']

# [u'#1f77b4', u'#ff7f0e', u'#2ca02c', u'#d62728', u'#9467bd', u'#8c564b', u'#e377c2', u'#7f7f7f', u'#bcbd22', u'#17becf']

Oder gleichwertig in python3:

print(plt.rcParams['axes.prop_cycle'].by_key()['color'])

In Versionen <1.5 wurde dies genannt color_cycle:

print plt.rcParams['axes.color_cycle']

# [u'b', u'g', u'r', u'c', u'm', u'y', u'k']

Beachten Sie, dass die Standardfarbe Zyklus in Version geändert 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle

tmdavison
quelle
3
Vielen Dank! Leichte Korrektur: Die erste sollte sein:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
Peter
4
@ Peter, ja, oderplt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison
86

Oft ist es nicht erforderlich, den Standardfarbzyklus von irgendwoher abzurufen, da dies der Standardfarbzyklus ist. Daher ist es ausreichend, ihn nur zu verwenden.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    line, = ax.plot(t,i*(t+1), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color = line.get_color(), linestyle = ':')

plt.show()

Geben Sie hier die Bildbeschreibung ein

Falls Sie wollen verwenden den Standard - Farbzyklus für etwas anderes, gibt es natürlich mehrere Möglichkeiten.

Farbkarte "tab10"

Zunächst sollte erwähnt werden, dass die "tab10"Farbkarte die Farben aus dem Standardfarbzyklus enthält, über den Sie sie erhalten können cmap = plt.get_cmap("tab10").

Äquivalent zu dem oben genannten wäre daher

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cmap = plt.get_cmap("tab10")
for i in range(4):
    ax.plot(t,i*(t+1),   color=cmap(i), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color=cmap(i), linestyle = ':')

plt.show()

Farben aus dem Farbzyklus

Sie können den Farbzyklus auch direkt verwenden cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. Dies gibt eine Liste mit den Farben aus dem Zyklus, über die Sie iterieren können.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']

for i in range(4):
    ax.plot(t,i*(t+1),   color=cycle[i], linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color=cycle[i], linestyle = ':')

plt.show()

Die CNNotation

Schließlich CNerlaubt die Notation, die Ndritte Farbe des Farbzyklus zu erhalten color="C{}".format(i). Dies funktioniert jedoch nur für die ersten 10 Farben ( N in [0,1,...9])

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    ax.plot(t,i*(t+1),   color="C{}".format(i), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color="C{}".format(i), linestyle = ':')

plt.show()

Alle hier dargestellten Codes erzeugen das gleiche Diagramm.

Wichtigkeit von BeErnest
quelle
Ist es möglich, matplotlib anzuweisen, einen Zyklus zu verwenden? Wenn Sie über das Farbarray iterieren müssen, müssen Sie die Logik hinzufügen, um nach Verwendung eines vollständigen Zyklus zum Index 0 zurückzukehren.
Mehdi
@ Mehdi Sicher, Matplotlib verwendet einen Farbzyklus. Diese Frage fragt nach den Farben dieses Zyklus.
ImportanceOfBeingErnest
5
Ich denke, CNNotation sollte in Ihrer Antwort viel wichtiger sein, ich habe sie fast verpasst. Ich vermute, dass die überwiegende Mehrheit der Anwendungsfälle damit zufrieden ist, nur auf die ersten 10 Farben zugreifen zu können, und das Übergeben 'C1'eines Freundes ist weitaus weniger wichtig als das explizite Ergreifen des Requisitenzyklus.
Andras Deak
2

Wenn Sie nach einem schnellen Einzeiler suchen, um die RGB-Farben zu erhalten, die matplotlib für seine Linien verwendet, finden Sie hier:

>>> import matplotlib; print('\n'.join([str(matplotlib.colors.to_rgb(c)) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(0.12156862745098039, 0.4666666666666667, 0.7058823529411765)
(1.0, 0.4980392156862745, 0.054901960784313725)
(0.17254901960784313, 0.6274509803921569, 0.17254901960784313)
(0.8392156862745098, 0.15294117647058825, 0.1568627450980392)
(0.5803921568627451, 0.403921568627451, 0.7411764705882353)
(0.5490196078431373, 0.33725490196078434, 0.29411764705882354)
(0.8901960784313725, 0.4666666666666667, 0.7607843137254902)
(0.4980392156862745, 0.4980392156862745, 0.4980392156862745)
(0.7372549019607844, 0.7411764705882353, 0.13333333333333333)
(0.09019607843137255, 0.7450980392156863, 0.8117647058823529)

Oder für uint8:

import matplotlib; print('\n'.join([str(tuple(int(round(v*255)) for v in matplotlib.colors.to_rgb(c))) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(31, 119, 180)
(255, 127, 14)
(44, 160, 44)
(214, 39, 40)
(148, 103, 189)
(140, 86, 75)
(227, 119, 194)
(127, 127, 127)
(188, 189, 34)
(23, 190, 207)
Peter
quelle
2

Die CN-Notation wurde überarbeitet

Ich möchte auf eine neue Entwicklung von Matplotlib eingehen. In einer früheren Antwort haben wir gelesen

Schließlich CNerlaubt die Notation, die Ndritte Farbe des Farbzyklus zu erhalten color="C{}".format(i). Dies funktioniert jedoch nur für die ersten 10 Farben ( N in [0,1,...9])

aber

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0,6.28, 629)                                                      
for N in (1, 2): 
    C0N, C1N = 'C%d'%(N), 'C%d'%(N+10) 
    plt.plot(t, N*np.sin(t), c=C0N, ls='-',  label='c='+C0N) 
    plt.plot(t, N*np.cos(t), c=C1N, ls='--', label='c='+C1N) 
plt.legend() ; plt.grid() ; plt.show()                                           

gibt

Geben Sie hier die Bildbeschreibung ein

gboffi
quelle