Dapatkan siklus warna garis default


95

Saya perhatikan ketika Anda memplot bahwa baris pertama berwarna biru, lalu hijau, lalu merah, dan seterusnya.

Adakah cara untuk mengakses daftar warna ini? Saya telah melihat jutaan posting tentang cara mengubah siklus warna atau mengakses iterator, tetapi tidak tentang cara mendapatkan daftar warna yang siklus matplotlib secara default.

Jawaban:


119

Dalam versi matplotlib> = 1.5, Anda dapat mencetak yang rcParamdisebut 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']

Atau setara, di python3:

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

Di versi <1.5, ini disebut color_cycle:

print plt.rcParams['axes.color_cycle']

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

Perhatikan bahwa siklus warna default berubah di versi 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle


3
Terima kasih! Sedikit koreksi: Yang pertama seharusnya:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
Peter

4
@ Peter, ya, atauplt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison

91

Seringkali, tidak perlu mendapatkan siklus warna default dari mana saja, karena ini adalah siklus warna default, jadi cukup menggunakannya saja sudah cukup.

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

masukkan deskripsi gambar di sini

Jika Anda ingin menggunakan siklus warna default untuk sesuatu yang berbeda, tentu saja ada beberapa pilihan.

peta warna "tab10"

Pertama-tama harus disebutkan bahwa peta "tab10"warna terdiri dari warna-warna dari siklus warna default, Anda bisa mendapatkannya melalui cmap = plt.get_cmap("tab10").

Setara dengan hal di atas maka akan menjadi

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

Warna dari siklus warna

Anda juga dapat menggunakan color cycler secara langsung cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. Ini memberikan daftar dengan warna dari siklus, yang dapat Anda gunakan untuk mengulang.

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

The CNnotasi

Akhirnya, CNnotasi memungkinkan untuk mendapatkan Nwarna siklus warna color="C{}".format(i),. Namun ini hanya berfungsi untuk 10 warna pertama ( 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()

Semua kode yang disajikan di sini menghasilkan plot yang sama.


apakah mungkin untuk memberi tahu matplotlib untuk menggunakan semacam siklus? Harus mengulangi larik warna berarti Anda harus menambahkan logika untuk kembali ke indeks 0 setelah menggunakan satu siklus penuh.
Mehdi

@Mehdi Tentu, matplotlib memang menggunakan siklus warna. Pertanyaan ini menanyakan untuk mendapatkan warna dari siklus ini.
ImportanceOfBeingErnest

5
Saya pikir CNnotasi harus jauh lebih menonjol dalam jawaban Anda, saya hampir melewatkannya. Saya menduga sebagian besar kasus penggunaan senang dengan hanya dapat mengakses 10 warna pertama, dan melewati 'C1'teman jauh lebih mudah daripada secara eksplisit mengambil siklus prop.
Andras Deak

3

Notasi CN ditinjau kembali

Saya ingin membahas perkembangan baru Matplotlib. Dalam jawaban sebelumnya kita membaca

Akhirnya, CNnotasi memungkinkan untuk mendapatkan Nwarna siklus warna color="C{}".format(i),. Namun ini hanya berfungsi untuk 10 warna pertama ( N in [0,1,...9])

tapi

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

memberi

masukkan deskripsi gambar di sini


2

jika Anda mencari one-liner cepat untuk mendapatkan warna RGB yang digunakan matplotlib untuk garisnya, ini dia:

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

Atau untuk 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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.