รับรอบสีของเส้นเริ่มต้น


95

ฉันสังเกตว่าเมื่อคุณพล็อตว่าบรรทัดแรกเป็นสีน้ำเงินจากนั้นเป็นสีเขียวตามด้วยสีแดงและอื่น ๆ

มีวิธีใดบ้างในการเข้าถึงรายการสีนี้? ฉันได้เห็นโพสต์ล้านโพสต์เกี่ยวกับวิธีการเปลี่ยนวงจรสีหรือเข้าถึงตัววนซ้ำ แต่ไม่ใช่วิธีรับรายการสีที่ matplotlib วนรอบตามค่าเริ่มต้น

คำตอบ:


119

ในเวอร์ชัน matplotlib> = 1.5 คุณสามารถพิมพ์สิ่งที่rcParamเรียกว่า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']

หรือเทียบเท่าในpython3:

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

ในเวอร์ชัน <1.5 สิ่งนี้ถูกเรียกว่าcolor_cycle:

print plt.rcParams['axes.color_cycle']

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

โปรดทราบว่าวงจรสีเริ่มต้นเปลี่ยนไปในเวอร์ชัน 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle


3
ขอบคุณ! แก้ไขเล็กน้อย: ข้อแรกควรเป็น:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
ปีเตอร์

4
plt.rcParams['axes.prop_cycle'].by_key()['color']
@Peter

91

บ่อยครั้งไม่จำเป็นต้องรับรอบสีเริ่มต้นจากที่ใดก็ได้เนื่องจากเป็นค่าเริ่มต้นดังนั้นเพียงแค่ใช้ก็เพียงพอแล้ว

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

ป้อนคำอธิบายภาพที่นี่

ในกรณีที่คุณต้องการใช้วงจรสีเริ่มต้นสำหรับสิ่งที่แตกต่างออกไปแน่นอนว่ามีตัวเลือกมากมาย

"tab10" colormap

ครั้งแรกก็ควรจะ mentionned ว่าตารางสีประกอบด้วยสีจากวงจรสีเริ่มต้นที่คุณจะได้รับผ่านทาง"tab10"cmap = plt.get_cmap("tab10")

จึงจะเทียบเท่ากับข้างต้น

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

สีจากวงจรสี

นอกจากนี้คุณยังสามารถใช้ Cycler cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']สีโดยตรง สิ่งนี้ให้รายการที่มีสีจากวงจรซึ่งคุณสามารถใช้เพื่อทำซ้ำได้

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

CNสัญกรณ์

สุดท้ายCNสัญกรณ์ช่วยให้เพื่อให้ได้Nสี TH color="C{}".format(i)ของวงจรสี อย่างไรก็ตามสิ่งนี้ใช้ได้กับ 10 สีแรกเท่านั้น ( 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()

รหัสทั้งหมดที่นำเสนอที่นี่สร้างพล็อตเดียวกัน


เป็นไปได้ไหมที่จะบอกให้ matplotlib ใช้วงจรบางประเภท การต้องวนซ้ำอาร์เรย์สีหมายความว่าคุณต้องเพิ่มตรรกะเพื่อกลับไปที่ดัชนี 0 หลังจากใช้หนึ่งรอบเต็ม
Mehdi

@Mehdi แน่นอนว่า matplotlib ใช้วงจรสี คำถามนี้ถามเพื่อให้ได้สีของวงจรนี้
ImportanceOfBeingErnest

5
ฉันคิดว่าCNสัญกรณ์ควรจะโดดเด่นกว่านี้มากในคำตอบของคุณฉันเกือบพลาดแล้ว ฉันสงสัยว่ากรณีการใช้งานส่วนใหญ่มีความสุขที่สามารถเข้าถึงได้เฉพาะ 10 สีแรกและการส่งผ่าน'C1'เพื่อนเป็นวิธีที่น้อยกว่าการคว้ารอบเสาอย่างชัดเจน
Andras Deak

3

มีการทบทวนสัญกรณ์ CN

ฉันต้องการกล่าวถึงการพัฒนาใหม่ของ Matplotlib ในคำตอบก่อนหน้านี้เราอ่าน

สุดท้ายCNสัญกรณ์ช่วยให้เพื่อให้ได้Nสี TH color="C{}".format(i)ของวงจรสี อย่างไรก็ตามสิ่งนี้ใช้ได้กับ 10 สีแรกเท่านั้น ( N in [0,1,...9])

แต่

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

ให้

ป้อนคำอธิบายภาพที่นี่


2

หากคุณกำลังมองหาหนึ่งซับที่รวดเร็วเพื่อให้ได้สี RGB ที่ matplotlib ใช้สำหรับเส้นของมันนี่คือ:

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

หรือสำหรับ 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.