จะเลือกสีใหม่สำหรับแต่ละเส้นที่พล็อตภายในรูปใน matplotlib ได้อย่างไร?


109

ฉันไม่ต้องการระบุสีสำหรับแต่ละเส้นพล็อตและให้แต่ละบรรทัดมีสีที่แตกต่างกัน แต่ถ้าฉันวิ่ง:

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

จากนั้นฉันจะได้ผลลัพธ์นี้:

ภาพกราฟแสดงผลตามโค้ดด้านบน

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

คำตอบ:


59

matplotlib 1.5+

คุณสามารถใช้axes.set_prop_cycle( ตัวอย่าง )

matplotlib 1.0-1.4

คุณสามารถใช้axes.set_color_cycle( ตัวอย่าง )

matplotlib 0.x

คุณสามารถใช้Axes.set_default_color_cycle.


1
เพิ่มเติมตามบรรทัดของสิ่งที่ฉันกำลังมองหา ... มีโอกาสใดที่คุณสามารถเพิ่มข้อมูลเกี่ยวกับวิธีการใช้ colormap เพื่อสร้างรายการ N สี?
dlamotte

19
@xyld - ไม่เสียบคำตอบของตัวเองมากเกินไป แต่มีตัวอย่างที่ด้านล่างของคำตอบนี้: stackoverflow.com/questions/4805048/...โดยทั่วไปคุณเพียงแค่ทำสิ่งนี้[colormap(i) for i in np.linspace(0, 0.9, num_plots)]ที่colormapเป็นหนึ่งใน colormaps ในmatplotlib.pyplot.cmและnumplotsเป็นจำนวน ของสีที่เป็นเอกลักษณ์ที่คุณต้องการ ระวังว่าอาจส่งผลให้เกิดสีที่แยกออกจากกันได้ยาก !!
Joe Kington

4
Joe ตอบได้ดีและดูเหมือนว่าจะตอบคำถามของ xyld ดังนั้นฉันจะปล่อยไว้ตรงนี้ อย่างไรก็ตามเป็นที่น่าสังเกตว่ามีคำตอบที่ดีสำหรับคำถามเกี่ยวกับการสร้างสีที่แตกต่างกันเช่นstackoverflow.com/questions/470690/…
tom10

มันใช้ได้กับพล็อตใด ๆ ? ฉันได้ลอง set_prop_cycle บน Axes3D แล้วฉันใช้สำหรับการวนซ้ำสำหรับหลาย ๆ พล็อตด้วย ax.plot_wireframe () แต่ 2 พล็อตมีสีด้วยสีเดียวกัน
Joonho Park

114

ฉันมักจะใช้อันที่สองต่อไปนี้:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

ตัวอย่าง 2: ตัวอย่างพล็อตด้วย iter สีถัดไป


ฉันใช้ # 2 ฉันมีรายชื่อช่องที่ต้องวางแผน แต่อาจมีความยาวแตกต่างกันไป ฉันพบว่าการตั้งค่า n = len ของรายการนั้นมีประโยชน์มากในการตรวจสอบให้แน่ใจว่าสีที่เลือกครอบคลุมช่วงและคุณสามารถบอกความแตกต่างได้ หากตัวเลขนั้นสูงเกินไปก็ยากที่จะเห็นความแตกต่างของสี
mauve

ฉันใช้ # 1 มันมีประโยชน์ที่จะใช้กับ enumerate (list_name)
DevX

11

prop_cycle

color_cycleถูกเลิกใช้ใน 1.5 เพื่อสนับสนุนลักษณะทั่วไปนี้: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

ยังแสดงในตัวอย่าง (ตอนนี้ชื่อไม่ดี): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html ที่กล่าวถึงที่: https://stackoverflow.com/a/4971431/895245

ทดสอบใน matplotlib 1.5.1


9

ฉันไม่รู้ว่าคุณสามารถเปลี่ยนสีโดยอัตโนมัติได้หรือไม่ แต่คุณสามารถใช้ประโยชน์จากลูปของคุณเพื่อสร้างสีต่างๆได้:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

ในกรณีนี้สีจะแตกต่างกันไปตั้งแต่สีดำจนถึงสีเขียว 100% แต่คุณสามารถปรับแต่งได้หากต้องการ

ดูเอกสารmatplotlib plot ()และค้นหาcolorอาร์กิวเมนต์คำหลัก

หากคุณต้องการป้อนรายการสีเพียงตรวจสอบให้แน่ใจว่าคุณมีรายการที่ใหญ่พอจากนั้นใช้ดัชนีของลูปเพื่อเลือกสี

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])

1
ใช่ฉันอยากจะหลีกเลี่ยงการทำอะไรแบบนี้ ฉันดูแผนที่สี แต่ฉันค่อนข้างสับสนว่าจะใช้มันอย่างไร
dlamotte

โซลูชันนี้ไม่ได้สร้างวิธีง่ายๆในการควบคุม colormap
Ryszard Cetnarski

นี่เป็นสิ่งที่ดีมากโดยเฉพาะเมื่อ set_prop_cycle ล้มเหลว ฉันไม่รู้ว่าทำไม set_prop_cycle หรือการระบายสีอัตโนมัติจึงล้มเหลวใน plot_wireframe () ใน Axes3D แต่นี่เป็นวิธีแก้ปัญหาพื้นฐาน / คู่มือสำหรับการระบายสี
Joonho Park

6

คุณสามารถใช้ "colormap เชิงคุณภาพ" ที่กำหนดไว้ล่วงหน้าดังนี้:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

ทดสอบกับ matplotlib 3.0.3 ดูhttps://github.com/matplotlib/matplotlib/issues/10840axes.set_prop_cycle(color=cmap)สำหรับการอภิปรายเกี่ยวกับเหตุผลที่คุณไม่สามารถเรียก

รายการ colormaps เชิงคุณภาพที่กำหนดไว้ล่วงหน้ามีอยู่ที่https://matplotlib.org/gallery/color/colormap_reference.html :

รายชื่อ colormaps เชิงคุณภาพ


โปรดทราบว่าจะใช้สี 3 สีแรกตามลำดับ
Ben Jones

2

คุณยังสามารถเปลี่ยนรอบสีเริ่มต้นในmatplotlibrcไฟล์ของคุณได้ หากคุณไม่ทราบว่าไฟล์นั้นอยู่ที่ไหนให้ทำดังต่อไปนี้ใน python:

import matplotlib
matplotlib.matplotlib_fname()

ซึ่งจะแสดงเส้นทางไปยังไฟล์ matplotlibrc ที่คุณใช้อยู่ในปัจจุบัน ในไฟล์นั้นคุณจะพบกับการตั้งค่าอื่น ๆ อีกมากมายเช่นaxes.color.cycleกัน เพียงใส่ลำดับสีที่คุณต้องการแล้วคุณจะพบมันในทุกพล็อตที่คุณทำ โปรดทราบว่าคุณยังสามารถใช้ชื่อสี html ที่ถูกต้องทั้งหมดใน matplotlib


0

ในฐานะบันทึกคำตอบของ Ciroคุณสามารถใช้prop_cycleเพื่อกำหนดรายการสีสำหรับ matplotlib เพื่อหมุนเวียน แต่จะมีกี่สี? จะเป็นอย่างไรหากคุณต้องการใช้วัฏจักรสีเดียวกันสำหรับพล็อตจำนวนมากโดยมีจำนวนเส้นต่างกัน

กลยุทธ์อย่างหนึ่งคือการใช้สูตรเช่นเดียวกับที่มาจากhttps://gamedev.stackexchange.com/a/46469/22397เพื่อสร้างลำดับสีที่ไม่มีที่สิ้นสุดโดยแต่ละสีพยายามให้แตกต่างอย่างมีนัยสำคัญจากทุกสีที่อยู่ข้างหน้า

น่าเสียดายที่prop_cycleไม่ยอมรับลำดับที่ไม่มีที่สิ้นสุด - มันจะค้างตลอดไปถ้าคุณผ่านมันไป แต่เราสามารถพูด 1,000 สีแรกที่สร้างจากลำดับดังกล่าวและตั้งเป็นวงจรสี ด้วยวิธีนี้สำหรับพล็อตที่มีจำนวนเส้นที่เหมาะสมคุณควรได้รับสีที่แตกต่างกัน

ตัวอย่าง:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

เอาท์พุต:

สร้างกราฟตามโค้ดด้านบน

ตอนนี้สีทั้งหมดแตกต่างกัน - แม้ว่าฉันจะยอมรับว่าฉันพยายามแยกแยะไม่กี่สีก็ตาม!

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