Tek bir şekilde farklı araziler için farklı renkli çizgiler nasıl elde edilir?


203

matplotlibArsalar oluşturmak için kullanıyorum . Her çizimi Python tarafından otomatik olarak oluşturulması gereken farklı bir renkle tanımlamalıyım.

Bana aynı şekilde farklı araziler için farklı renkler koymak için bir yöntem verebilir misiniz?

Yanıtlar:


427

Matplotlib bunu varsayılan olarak yapar.

Örneğin:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

Renk döngüsünü gösteren temel çizim

Ve bildiğiniz gibi, kolayca bir efsane ekleyebilirsiniz:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Efsane ile temel çizim

Çevrilecek renkleri kontrol etmek istiyorsanız:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Varsayılan renk döngüsü üzerindeki kontrolü gösteren çizim

Matplotlib'i bilmiyorsanız , öğretici başlamak için iyi bir yerdir .

Düzenle:

Öncelikle, bir figür üzerinde çizmek istediğiniz çok şey varsa (> 5), ya da:

  1. Onları farklı arazilere koyun (bir şekil üzerinde birkaç alt grafik kullanmayı düşünün) veya
  2. Aralarında ayrım yapmak için renkten başka bir şey (örn. İşaretçi stilleri veya çizgi kalınlığı) kullanın.

Aksi takdirde, çok dağınık bir arsa ile dolacaksınız! Kim ne yaparsanız okuyacak kimseye iyi olun ve bir figür üzerine 15 farklı şeyi sıkıştırmaya çalışmayın !!

Bunun ötesinde, birçok insan değişen derecelerde renk körüdür ve çok sayıda farklı renk arasında ayrım yapmak fark edebileceğinizden daha fazla insan için zordur.

Bununla birlikte, 20 göreli olarak farklı renkle bir eksene gerçekten 20 satır koymak istiyorsanız, bunu yapmanın bir yolu var:

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

Belirli bir renk haritasına göre 20 satır için benzersiz renkler


17
Son örnek için, matplotlib'in daha yeni sürümlerinde, set_color_cyclekullanımdan kaldırılmıştır, bu nedenle bu satır olmalı plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))ve sadece plt.cm.YOUR_PREFERED_COLOR_MAPihtiyaçlarınıza göre değiştirilmelidir.
Nate

1
@JoeKington: Açıklama harikaydı, Çok teşekkür ederim
Rika

bu harika. onları etkileşimli yapmanın bir yolu var mı? örneğin RI'de ggplot'u ggplotly () öğesine dönüştürün ve çizim html etkileşimli hale gelir
kRazzy R

OP'nin Matplotlib renklerinin tek bir arsada (tek bir axes) uygun şekilde farklı eğrileri bildiğine ve farklı parsellerde (farklı axes) tek bir çizginin rengini değiştirmesini istediğine ikna oldum ... soru (muhtemelen OP'nin sorduğundan farklıdır, ancak kimse bu tek soruyu sordukları ve kayboldukları için söyleyemez!) - +1
gboffi

37

Daha sonra ayarlamak

Eğer çizeceğiniz arazilerin sayısını bilmiyorsanız, onları kullanarak doğrudan çizimden numarayı alarak çizdikten sonra renkleri değiştirebilirsiniz, .linesbu çözümü kullanıyorum:

Bazı rastgele veriler

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

İhtiyacınız olan kod parçası:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])
  

ax1.legend(loc=2)

Sonuç şudur:resim açıklamasını buraya girin


8

TL; DR Hayır, otomatik olarak yapılamaz . Evet mümkün.

import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))

resim açıklamasını buraya girinaxesBir şekildeki ( figure) her çizimin ( ) kendi renk döngüsü vardır - her çizim için farklı bir rengi zorlamazsanız, tüm grafikler aynı renk sırasını paylaşır, ancak "otomatik" in ne anlama geldiğini biraz uzatırsak , yapılabilir.


OP yazdı

[...] Her grafiği, [Matplotlib] tarafından otomatik olarak oluşturulması gereken farklı bir renkle tanımlamam gerekiyor.

Ancak ... Matplotlib, her farklı eğri için otomatik olarak farklı renkler üretir

In [10]: import numpy as np
    ...: import matplotlib.pyplot as plt

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:

resim açıklamasını buraya girin

Peki neden OP talebi? Eğer okumaya devam edersek,

Bana aynı şekilde farklı araziler için farklı renkler koymak için bir yöntem verebilir misiniz?

ve bu mantıklıdır, çünkü her bir komplo (her axesbiri Matplotlib'in görüşünde) kendi color_cycle(veya daha doğrusu, 2018'de prop_cycle) ve her bir komplo ( axes) aynı renkleri aynı sırayla kullanır.

In [12]: fig, axes = plt.subplots(2,3)

In [13]: for ax in axes.flatten():
    ...:     ax.plot((0,1), (0,1))

resim açıklamasını buraya girin

Orijinal sorunun anlamı buysa, bir olasılık her arsa için açıkça farklı bir renk adlandırmaktır.

Grafikler (sık sık olduğu gibi) bir döngü içinde oluşturulursa, Matplotlib tarafından otomatik olarak seçilen rengi geçersiz kılmak için ek bir döngü değişkenine sahip olmalıyız.

In [14]: fig, axes = plt.subplots(2,3)

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
    ...:     ax.plot((0,1), (0,1), short_color_name)

resim açıklamasını buraya girin

Başka bir olasılık, bir cycler nesnesini somutlaştırmaktır

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

resim açıklamasını buraya girin

Not type(my_cycler)olduğunu cycler.Cyclerancak type(actual_cycler)olduğunu itertools.cycle.


3

Ben önceki yazı verilen son döngü cevap küçük bir gelişme sunmak istiyorum (bu yazı doğru ve hala kabul edilmelidir). Son örnek etiketlenirken yapılan zımni varsayım, plt.label(LIST)X numaralı etikete LIST, X'inci zamana karşılık gelen satırın plotçağrılmasıdır. Daha önce bu yaklaşımla ilgili sorunlar yaşadım. Matplotlibs belgelerine göre efsaneler oluşturmanın ve etiketlerini özelleştirmenin önerilen yolu ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ), etiketlerin iyi gittiğini hissetmek yaptıklarını düşündüğünüz kesin arazilerle birlikte:

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**: Matplotlib Efsaneleri çalışmıyor


3
Sadece fyi: "label" kwarg komutunu kullanarak çizim yapabilir ve daha sonra herhangi bir argüman olmadan efsaneyi çağırabilirsiniz.
Joe Kington

0

Matplot planınızı farklı renklerle renklendirir, ancak belirli renkleri koymak istediğinizde

import matplotlib.pyplot as plt
import numpy as np
        
x = np.arange(10)
        
plt.plot(x, x)
plt.plot(x, 2 * x,color='blue')
plt.plot(x, 3 * x,color='red')
plt.plot(x, 4 * x,color='green')
plt.show()
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.