Varsayılan çizgi rengi döngüsünü alın


95

İlk çizginin mavi, sonra yeşil, sonra kırmızı ve benzerlerini çizdiğinizde fark ettim.

Bu renk listesine erişmenin bir yolu var mı? Renk döngüsünün nasıl değiştirileceğine veya yineleyiciye nasıl erişileceğine dair bir milyon gönderi gördüm, ancak matplotlib'in varsayılan olarak içinden geçtiği renklerin listesini nasıl alacağıma dair değil.

Yanıtlar:


119

Matplotlib sürümleri> = 1.5 olarak, yazdırabilirsiniz rcParamdenilen 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']

Veya eşdeğer olarak, içinde python3:

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

1.5'ten küçük sürümlerde buna şunlar deniyordu color_cycle:

print plt.rcParams['axes.color_cycle']

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

Varsayılan renk döngüsünün 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle sürümünde değiştiğini unutmayın.


3
Teşekkürler! Küçük bir düzeltme: İlki şöyle olmalıdır:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
Peter

4
@Peter, yes, orplt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison 02

91

Çoğu zaman, varsayılan renk döngüsünü herhangi bir yerden almaya gerek yoktur, çünkü bu varsayılan renktir, bu nedenle sadece kullanmak yeterlidir.

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()

görüntü açıklamasını buraya girin

Varsayılan renk döngüsünü farklı bir şey için kullanmak istemeniz durumunda , elbette birkaç seçenek vardır.

"tab10" renk haritası

Öncelikle, "tab10"renk haritasının varsayılan renk döngüsündeki renkleri içerdiği belirtilmelidir, bunu elde edebilirsiniz cmap = plt.get_cmap("tab10").

Yukarıdakine eşdeğer, dolayısıyla

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()

Renk döngüsünden renkler

Renk döngüleyiciyi doğrudan da kullanabilirsiniz cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. Bu, üzerinde yinelemek için kullanabileceğiniz döngüdeki renklerin listesini verir.

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()

CNnotasyonu

Son olarak, CNgösterim N, renk döngüsünün rengini almayı sağlar color="C{}".format(i). Ancak bu yalnızca ilk 10 renk için geçerlidir ( 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()

Burada sunulan tüm kodlar aynı grafiği oluşturur.


matplotlib'e bir tür döngü kullanmasını söylemek mümkün mü? Colors dizisi üzerinde yineleme yapmak zorunda olmak, bir tam döngü kullandıktan sonra dizin 0'a geri dönme mantığını eklemeniz gerektiği anlamına gelir.
Mehdi

@Mehdi Elbette, matplotlib bir renk döngüsü kullanıyor. Bu soru, bu döngünün renklerini almayı ister.
ImportanceOfBeingErnest

5
Bence CNcevabınızda notasyon çok daha belirgin olmalı, neredeyse kaçırdım. Kullanım durumlarının büyük çoğunluğunun yalnızca ilk 10 renge erişebilmekten memnun olduğunu ve 'C1'bir arkadaşın geçmesinin , açık bir şekilde prop döngüsünü kapmaktan çok daha az standart bir şablon olduğundan şüpheleniyorum .
Andras Deak

3

CN notasyonu yeniden ziyaret edildi

Matplotlib'in yeni bir gelişimini ele almak istiyorum. Önceki cevapta okuduk

Son olarak, CNgösterim N, renk döngüsünün rengini almayı sağlar color="C{}".format(i). Ancak bu yalnızca ilk 10 renk için geçerlidir ( N in [0,1,...9])

fakat

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()                                           

verir

görüntü açıklamasını buraya girin


2

matplotlib'in çizgileri için kullandığı RGB renklerini elde etmek için hızlı bir tek satırlık ürün arıyorsanız, işte burada:

>>> 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)

Veya uint8 için:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.