Matplotlib'de bir şekil içinde çizilen her çizgi için yeni bir renk nasıl seçilir?


109

Çizilen her çizgi için bir renk BELİRMEMEK ve her çizginin farklı bir renk almasını istemiyorum. Ama koşarsam:

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

plt.show()

sonra şu çıktıyı alıyorum:

Yukarıdaki koda göre grafik çıktısının görüntüsü

Yukarıdaki resme bakarsanız, matplotlib'in her satır için farklı olan renkleri seçmeye çalıştığını, ancak sonunda renkleri yeniden kullandığını görebilirsiniz - ilk on satır, alttaki on ile aynı renkleri kullanır. Sadece halihazırda kullanılan renkleri tekrarlamasını engellemek VE / VEYA onu kullanılacak bir renk listesi ile beslemek istiyorum.

Yanıtlar:


59

matplotlib 1.5+

axes.set_prop_cycle( Örnek ) kullanabilirsiniz .

matplotlib 1.0-1.4

axes.set_color_cycle( Örnek ) kullanabilirsiniz .

matplotlib 0.x

Kullanabilirsiniz Axes.set_default_color_cycle.


1
Aradığım şeyin daha fazlası ... N renkten oluşan bir liste oluşturmak için bir renk haritasının nasıl kullanılacağına dair bilgi ekleme şansınız var mı?
dlamotte

19
@xyld - Kendi cevabımı çok fazla doldurmam, ancak bu cevabın altında bir örnek var: stackoverflow.com/questions/4805048/… Temel olarak şunu yaparsınız:, renk haritalarından biri [colormap(i) for i in np.linspace(0, 0.9, num_plots)]nerede ve sayıdır İstediğiniz benzersiz renklerin. Bunun, birbirinden ayırt edilmesi zor renklerle sonuçlanabileceğine dikkat edin !! colormapmatplotlib.pyplot.cmnumplots
Joe Kington

4
Güzel cevap Joe, ve xyld'nin sorusuna cevap veriyor gibi görünüyor, bu yüzden bunu burada bırakacağım. Ayrıca, farklı renkler oluşturmayla ilgili sorulara, stackoverflow.com/questions/470690/…
tom10

Herhangi bir komplo için çalışıyor mu? Axes3D üzerinde set_prop_cycle denedim, sonra ax.plot_wireframe () ile çoklu grafikler için döngü için kullandım, ancak 2 grafik aynı renkle renklendirildi.
Joonho Park

113

Genellikle bunlardan ikincisini kullanırım:

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)

Örnek 2: iter, sonraki renk ile örnek çizim


# 2 kullandım. Çizmem gereken kanalların bir listesi var, ancak bunlar farklı uzunluklarda olabilir. Bu listenin n = len ayarının, seçilen renklerin aralığı kapsadığından emin olmak için çok yararlı olduğunu buldum ve farkı anlayabilirsiniz. Bu sayı çok yüksekse renklerdeki farkı görmek zor.
leylak

Ben, enumerate (LIST_NAME) ile kullanmak yararlı oldu 1. kullanılan
DevX

11

prop_cycle

color_cycle1.5 sürümünde bu genellemenin lehine kullanımdan kaldırıldı: 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()

Ayrıca (şimdi kötü bir şekilde adlandırılmış) örnekte gösteriliyor: http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html , şu adresten bahsediliyor: https://stackoverflow.com/a/4971431/895245

Matplotlib 1.5.1'de test edilmiştir.


9

Rengi otomatik olarak değiştirip değiştiremeyeceğinizi bilmiyorum, ancak farklı renkler oluşturmak için döngünüzden yararlanabilirsiniz:

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

Bu durumda renkler siyahtan% 100 yeşile değişecektir, ancak isterseniz onu ayarlayabilirsiniz.

Bkz matplotlib arsa () docs ve göz coloranahtar kelime argüman.

Bir renk listesi beslemek istiyorsanız, yeterince büyük bir listeye sahip olduğunuzdan emin olun ve ardından rengi seçmek için döngünün dizinini kullanın.

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

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

1
Evet, böyle bir şey yapmaktan kaçınmak istedim. Renkli Haritalara baktım, ancak onları nasıl kullanacağımı oldukça karıştırdım.
dlamotte

Bu çözüm, bir renk haritasını kontrol etmenin kolay bir yolunu
sağlamıyor

Bu çok iyidir, özellikle set_prop_cycle başarısız olduğunda. Axes3D'de plot_wireframe () 'de set_prop_cycle veya otomatik renklendirmenin neden başarısız olduğunu bilmiyorum. Ancak bu, renklendirme için bir tür temel / manuel çözümdür.
Joonho Park

6

Şunun gibi önceden tanımlanmış bir "niteliksel renk haritası" kullanabilirsiniz:

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 üzerinde test edilmiştir. Neden arayamayacağınızla ilgili tartışma için https://github.com/matplotlib/matplotlib/issues/10840 adresine bakın axes.set_prop_cycle(color=cmap).

Önceden tanımlanmış niteliksel renk haritalarının bir listesi https://matplotlib.org/gallery/color/colormap_reference.html adresinde mevcuttur :

Niteliksel renk haritalarının listesi


Bunlarda sırayla ilk 3 rengi aldığına dikkat edin
Ben Jones

2

matplotlibrcDosyanızdaki varsayılan renk döngüsünü de değiştirebilirsiniz . Bu dosyanın nerede olduğunu bilmiyorsanız, aşağıdakileri python'da yapın:

import matplotlib
matplotlib.matplotlib_fname()

Bu size halihazırda kullandığınız matplotlibrc dosyanızın yolunu gösterecektir. Bu dosyada diğer birçok ayarın yanı sıra axes.color.cycle. Sadece istediğiniz renk sırasını koyun ve yaptığınız her grafikte bulacaksınız. Matplotlib'de tüm geçerli html renk adlarını da kullanabileceğinizi unutmayın.


0

As Ciro cevabı notları kullanabilirsiniz prop_cycledolaşmak için matplotlib için renklerin bir listesini ayarlamak için. Ama kaç renk? Ya aynı renk döngüsünü farklı sayıda çizgi içeren çok sayıda çizim için kullanmak isterseniz?

Bir taktik, https://gamedev.stackexchange.com/a/46469/22397 adresindeki gibi bir formül kullanmak , her rengin kendinden öncekilerden önemli ölçüde farklı olmaya çalıştığı sonsuz bir renk dizisi oluşturmaktır.

Ne yazık ki, prop_cyclesonsuz dizileri kabul etmeyecek - bir tanesini geçerseniz sonsuza dek asılı kalacak. Ancak diyelim ki böyle bir diziden üretilen ilk 1000 rengi alıp renk döngüsü olarak ayarlayabiliriz. Bu şekilde, makul sayıda çizgiye sahip grafikler için ayırt edilebilir renkler elde etmelisiniz.

Misal:

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

Çıktı:

Yukarıdaki kodun grafik çıktısı

Şimdi, tüm renkler farklı - birkaçını ayırt etmekte zorlandığımı kabul etsem de!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.