2012-01-19 21 views
53

Bir renk eşlemi kullanarak çalışma zamanında sağlanan skaler değerlerle matplotlib'deki bir çizginin rengi nasıl ayarlanır (örneğin jet)? Burada birkaç farklı yaklaşım denedim ve sanırım kendimi darmadağın ettim. values[], bir dizi skaler dizisidir. eğriler 1-d diziler kümesidir ve etiketler bir dizi metin dizgisidir. Dizilerin her biri aynı uzunluktadır.Matplotlib'deki çizginin rengini ayarlamak için Colormaps kullanma

fig = plt.figure() 
ax = fig.add_subplot(111) 
jet = colors.Colormap('jet') 
cNorm = colors.Normalize(vmin=0, vmax=values[-1]) 
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) 
lines = [] 
for idx in range(len(curves)): 
    line = curves[idx] 
    colorVal = scalarMap.to_rgba(values[idx]) 
    retLine, = ax.plot(line, color=colorVal) 
    #retLine.set_color() 
    lines.append(retLine) 
ax.legend(lines, labels, loc='upper right') 
ax.grid() 
plt.show() 

cevap

66

aldığınız hata sen jet tanımlamak nasıl kaynaklanmaktadır. 'Jet' adıyla Colormap taban sınıfını yaratıyorsunuz, ancak bu 'jet' renk haritasının varsayılan tanımını almaktan çok farklı. Bu temel sınıf asla doğrudan yaratılmamalıdır ve sadece alt sınıflar örneklenmelidir.

Örneğinizde bulduğunuz şey, Matplotlib'de buggy davranışıdır. Bu kod çalıştırıldığında daha net bir hata mesajı oluşturulmalıdır.

Bu

sizin örnek güncellenmiş bir sürümü olup: creating over 20 unique legend colors using matplotlib

: Bir ScalarMappable kullanma

enter image description here

benim ilgili cevabında sunulan yaklaşımın üzerinde bir gelişmedir:

import matplotlib.pyplot as plt 
import matplotlib.colors as colors 
import matplotlib.cm as cmx 
import numpy as np 

# define some random data that emulates your indeded code: 
NCURVES = 10 
np.random.seed(101) 
curves = [np.random.random(20) for i in range(NCURVES)] 
values = range(NCURVES) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
# replace the next line 
#jet = colors.Colormap('jet') 
# with 
jet = cm = plt.get_cmap('jet') 
cNorm = colors.Normalize(vmin=0, vmax=values[-1]) 
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) 
print scalarMap.get_clim() 

lines = [] 
for idx in range(len(curves)): 
    line = curves[idx] 
    colorVal = scalarMap.to_rgba(values[idx]) 
    colorText = (
     'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2]) 
     ) 
    retLine, = ax.plot(line, 
         color=colorVal, 
         label=colorText) 
    lines.append(retLine) 
#added this to get the legend to work 
handles,labels = ax.get_legend_handles_labels() 
ax.legend(handles, labels, loc='upper right') 
ax.grid() 
plt.show() 

sonuçlanan

35

Ben de dahil etmek için yararlı olacağını düşündüm hat matplotlib'in cm-tipi nesnesiyle birleştiğinde numpy'nin linspace'ini kullanarak daha basit bir yöntem olduğunu düşünüyorum. Yukarıdaki çözümün eski bir sürüm için olması olasıdır. Ben python 3.4.3, matplotlib 1.4.3 ve numpy 1.9.3 kullanıyorum ve benim çözümüm aşağıdaki gibidir.

import matplotlib.pyplot as plt 

from matplotlib import cm 
from numpy import linspace 

start = 0.0 
stop = 1.0 
number_of_lines= 1000 
cm_subsection = linspace(start, stop, number_of_lines) 

colors = [ cm.jet(x) for x in cm_subsection ] 

for i, color in enumerate(colors): 
    plt.axhline(i, color=color) 

plt.ylabel('Line Number') 
plt.show() 

Bu durum, aşağıda betimlenen şekilde, tüm cm.jet renk haritası kapsayan 1000 benzersiz renkli çizgiler ile sonuçlanır. Bu komut dosyasını çalıştırırsanız, tek tek satırları yakınlaştırabilirsiniz.

cm.jet between 0.0 and 1.0 with 1000 graduations

Şimdi benim 1000 satır renkleri sadece ben sadece benim başlangıç ​​değiştirip 0.4 ile 0.6 değerleri durdurmak ve bu sadece% 20 kullanımı ile sonuçlanan 400 -600 satır aralarında yeşilimsi bölümüne uzanan istediğini söylüyorsun cm.jet renk haritası 0.4 ile 0.6 arasında.

cm.jet between 0.4 and 0.6 with 1000 graduations

Yani bir tek çizgi özetinde bir matplotlib gelen RGBA renklerin bir listesini oluşturabilir.buna göre cm renk haritası: Bu durumda

colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ] 

Ben sık çağrılan haritası adında jetini kullanmak ancak çağırarak sizin matplotlib sürümünde kullanılabilir renk haritaları tam listesini bulabilirsiniz: hattın

>>> from matplotlib import cm 
>>> dir(cm) 
+0

Bu yalnızca, 'dur' değerinizin 1 – Eric

+1

olması nedeniyle çalışır. Elbette, 1 en iyi değerdir. Daha geniş bir renk yelpazesi istiyorsanız, ihtiyacınız olan tek şey 'number_of_lines' artırmaktır. Ve gruptaki renklerin sadece bir kısmını istediğinizde "durdur" u ve gerektiğinde "başlat" ı arttırabilirsiniz. – Parousia

+0

Hızlı bir soru: Arsa yerine efsane yerine colorbar nasıl eklenir? –

7

bir kombinasyonunu matplotlib alınan stiller, belirteçler, ve nitel renkler:

import itertools 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
N = 8*4+10 
l_styles = ['-','--','-.',':'] 
m_styles = ['','.','o','^','*'] 
colormap = mpl.cm.Dark2.colors # Qualitative colormap 
for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, colormap)): 
    plt.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i) 
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4); 

enter image description here

İlgili konular