Bagaimana cara memilih warna baru untuk setiap garis plot dalam gambar di matplotlib?

109

Saya TIDAK ingin menentukan warna untuk setiap garis yang diplot, dan meminta setiap baris mendapatkan warna yang berbeda. Tetapi jika saya menjalankan:

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

plt.show()

maka saya mendapatkan output ini:

Gambar keluaran grafik dengan kode di atas

Jika Anda melihat gambar di atas, Anda dapat melihat bahwa matplotlib mencoba memilih warna untuk setiap baris yang berbeda, tetapi pada akhirnya ia menggunakan kembali warna - sepuluh baris teratas menggunakan warna yang sama dengan sepuluh baris terbawah. Saya hanya ingin menghentikannya mengulangi warna yang sudah digunakan DAN / ATAU memberinya daftar warna yang akan digunakan.

dlamotte.dll
sumber

Jawaban:

59

matplotlib 1.5+

Anda dapat menggunakan axes.set_prop_cycle( contoh ).

matplotlib 1.0-1.4

Anda dapat menggunakan axes.set_color_cycle( contoh ).

matplotlib 0.x

Anda bisa menggunakan Axes.set_default_color_cycle.

tom10
sumber
1
Lebih lanjut tentang apa yang saya cari ... Adakah kemungkinan Anda dapat menambahkan informasi tentang cara menggunakan peta warna untuk menghasilkan daftar warna N?
dlamotte
19
@xyld - Jangan memasukkan jawaban saya sendiri terlalu banyak, tetapi ada contoh di bagian bawah jawaban ini: stackoverflow.com/questions/4805048/… Pada dasarnya Anda hanya melakukan ini :, di [colormap(i) for i in np.linspace(0, 0.9, num_plots)]mana colormapsalah satu peta warna matplotlib.pyplot.cmdan numplotsnomornya warna unik yang Anda inginkan. Berhati-hatilah karena hal ini dapat menyebabkan warna yang sulit dibedakan satu sama lain !!
Joe Kington
4
Jawaban bagus Joe, dan sepertinya menjawab pertanyaan xyld, jadi saya akan berhenti di sini. Selain itu, perlu dicatat bahwa ada beberapa jawaban bagus untuk pertanyaan tentang menghasilkan warna yang berbeda, seperti stackoverflow.com/questions/470690/…
tom10
Apakah ini berfungsi untuk plot apa pun? Saya sudah mencoba set_prop_cycle di Axes3D, kemudian saya menggunakan for loop untuk beberapa plot dengan ax.plot_wireframe (), tetapi 2 plot diwarnai dengan warna yang sama.
Taman Joonho
112

Saya biasanya menggunakan yang kedua dari ini:

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)

Contoh 2: contoh plot dengan iter, warna berikutnya

Mark Amery
sumber
Saya menggunakan # 2. Saya memiliki daftar saluran yang perlu saya plot, tetapi panjang saluran tersebut dapat bervariasi. Saya menemukan bahwa pengaturan n = len dari daftar itu sangat membantu untuk memastikan bahwa warna yang dipilih menjangkau rentang dan Anda dapat membedakannya. Jika angka itu terlalu tinggi, sulit untuk melihat perbedaan warnanya.
mauve
Saya menggunakan # 1, itu berguna untuk digunakan dengan enumerate (list_name)
DevX
11

prop_cycle

color_cycletidak digunakan lagi di 1.5 karena mendukung generalisasi ini: 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()

Juga ditampilkan dalam contoh (sekarang bernama buruk): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html disebutkan di: https://stackoverflow.com/a/4971431/895245

Diuji di matplotlib 1.5.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
9

Saya tidak tahu apakah Anda dapat mengubah warna secara otomatis, tetapi Anda dapat memanfaatkan loop Anda untuk menghasilkan warna yang berbeda:

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

Dalam hal ini, warna akan bervariasi dari hitam hingga 100% hijau, tetapi Anda dapat menyesuaikannya jika mau.

Lihat dokumen matplotlib plot () dan cari colorargumen kata kunci.

Jika Anda ingin memberi makan daftar warna, pastikan Anda memiliki daftar yang cukup besar dan kemudian gunakan indeks loop untuk memilih warna

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

for i in range(20):
   ax1.plot(x, y, color = colors[i])
Andrea Spadaccini
sumber
1
Ya, saya agak ingin menghindari melakukan hal seperti ini. Saya melihat ke Color Maps, tapi saya agak bingung bagaimana menggunakannya.
dlamotte
Solusi ini tidak menghasilkan cara mudah untuk mengontrol peta warna
Ryszard Cetnarski
Ini sangat bagus, terutama saat set_prop_cycle gagal. Saya tidak tahu mengapa set_prop_cycle atau pewarnaan otomatis gagal di plot_wireframe () di Axes3D. Tapi ini semacam solusi dasar / manual untuk pewarnaan.
Joonho Park
6

Anda dapat menggunakan "peta warna kualitatif" yang telah ditentukan sebelumnya seperti ini:

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)

Diuji pada matplotlib 3.0.3. Lihat https://github.com/matplotlib/matplotlib/issues/10840 untuk diskusi tentang mengapa Anda tidak dapat menelepon axes.set_prop_cycle(color=cmap).

Daftar peta warna kualitatif yang telah ditentukan tersedia di https://matplotlib.org/gallery/color/colormap_reference.html :

Daftar peta warna kualitatif

nyanpasu64
sumber
Perhatikan bahwa ini mengambil 3 warna pertama secara berurutan pada ini
Ben Jones
2

Anda juga dapat mengubah siklus warna default di matplotlibrcfile Anda . Jika Anda tidak tahu di mana file itu, lakukan hal berikut dengan python:

import matplotlib
matplotlib.matplotlib_fname()

Ini akan menunjukkan kepada Anda jalur ke file matplotlibrc yang saat ini Anda gunakan. Dalam file itu Anda akan menemukan di antara banyak pengaturan lain juga yang untuk axes.color.cycle. Masukkan saja urutan warna yang Anda inginkan dan Anda akan menemukannya di setiap plot yang Anda buat. Perhatikan bahwa Anda juga dapat menggunakan semua nama warna html yang valid di matplotlib.

Thomasillo
sumber
0

Sebagai catatan jawaban Ciro , Anda dapat menggunakan prop_cycleuntuk mengatur daftar warna untuk matplotlib untuk digilir. Tapi berapa warnanya? Bagaimana jika Anda ingin menggunakan siklus warna yang sama untuk banyak plot, dengan jumlah garis yang berbeda?

Salah satu taktiknya adalah menggunakan rumus seperti yang ada di https://gamedev.stackexchange.com/a/46469/22397 , untuk menghasilkan urutan warna yang tak terbatas di mana setiap warna mencoba menjadi berbeda secara signifikan dari semua yang sebelumnya.

Sayangnya, prop_cycle tidak akan menerima urutan tak terbatas - itu akan menggantung selamanya jika Anda melewatinya. Tapi kita bisa mengambil, katakanlah, 1000 warna pertama yang dihasilkan dari urutan seperti itu, dan mengaturnya sebagai siklus warna. Dengan begitu, untuk plot dengan jumlah garis yang wajar, Anda akan mendapatkan warna yang dapat dibedakan.

Contoh:

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

Keluaran:

Output grafik dengan kode di atas

Sekarang, semua warna berbeda - meskipun saya akui bahwa saya kesulitan membedakan beberapa di antaranya!

Mark Amery
sumber