Nhận chu kỳ màu đường mặc định


95

Tôi nhận thấy khi bạn vẽ biểu đồ rằng dòng đầu tiên là màu xanh lam, sau đó là xanh lục, rồi đến màu đỏ, v.v.

Có một số cách để truy cập danh sách màu sắc này? Tôi đã xem một triệu bài đăng về cách thay đổi chu kỳ màu hoặc truy cập trình lặp, nhưng không phải về cách chỉ lấy danh sách các màu mà matplotlib xoay vòng theo mặc định.

Câu trả lời:


118

Trong các phiên bản matplotlib> = 1.5, bạn có thể in rcParamđược gọi là 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']

Hoặc tương đương, trong python3:

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

Trong các phiên bản <1.5, điều này được gọi là color_cycle:

print plt.rcParams['axes.color_cycle']

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

Lưu ý rằng chu kỳ màu mặc định đã thay đổi trong phiên bản 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle


3
Cảm ơn! Chỉnh sửa nhẹ: Điều đầu tiên phải là:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
Peter

4
@Peter, vâng, hoặcplt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison

91

Thông thường, không cần lấy chu kỳ màu mặc định từ bất kỳ đâu, vì nó là chu trình mặc định, vì vậy chỉ cần sử dụng nó là đủ.

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

nhập mô tả hình ảnh ở đây

Trong trường hợp bạn muốn sử dụng chu kỳ màu mặc định cho một thứ gì đó khác, tất nhiên có một số tùy chọn.

bản đồ màu "tab10"

Đầu tiên cần lưu ý rằng "tab10"bản đồ màu bao gồm các màu từ chu kỳ màu mặc định, bạn có thể lấy nó qua cmap = plt.get_cmap("tab10").

Tương đương với những điều trên do đó sẽ là

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

Màu sắc từ chu kỳ màu

Bạn cũng có thể sử dụng bộ tuần hoàn màu trực tiếp , cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. Điều này cung cấp danh sách với các màu từ chu kỳ, bạn có thể sử dụng để lặp lại.

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

các CNký hiệu

Cuối cùng, CNký hiệu cho phép lấy Nmàu thứ của chu kỳ màu , color="C{}".format(i). Tuy nhiên, điều này chỉ hoạt động với 10 màu đầu tiên ( 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()

Tất cả các mã được trình bày ở đây tạo ra cùng một âm mưu.


có thể nói matplotlib sử dụng một số loại chu kỳ không? Việc phải lặp lại mảng màu có nghĩa là bạn phải thêm logic để quay trở lại chỉ mục 0 sau khi sử dụng một chu kỳ đầy đủ.
Mehdi

@Mehdi Chắc chắn, matplotlib sử dụng chu kỳ màu. Câu hỏi này yêu cầu nhận được màu sắc của chu kỳ này.
Tầm quan

5
Tôi nghĩ rằng CNký hiệu nên nổi bật hơn nhiều trong câu trả lời của bạn, tôi gần như bỏ lỡ nó. Tôi nghi ngờ rằng phần lớn các trường hợp sử dụng hài lòng với việc chỉ có thể truy cập 10 màu đầu tiên và việc vượt qua 'C1'một người bạn là cách ít tạo ra hơn so với việc nắm bắt chu trình chống đỡ một cách rõ ràng.
Andras Deak

3

Ký hiệu CN đã được xem lại

Tôi muốn đề cập đến một bước phát triển mới của Matplotlib. Trong một câu trả lời trước, chúng tôi đã đọc

Cuối cùng, CNký hiệu cho phép lấy Nmàu thứ của chu kỳ màu , color="C{}".format(i). Tuy nhiên, điều này chỉ hoạt động với 10 màu đầu tiên ( N in [0,1,...9])

nhưng

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

cho

nhập mô tả hình ảnh ở đây


2

nếu bạn đang tìm kiếm một lớp lót nhanh chóng để có được màu RGB mà matplotlib sử dụng cho các dòng của nó, thì đây là:

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

Hoặc đối với 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.