2014-04-14 17 views
27

Çubukların belirli bir renk eşleminin renk kodlamasını takip etmesi gereken basit bir 1D histogramı çizmek istiyorum. İşte Histogramı colormap'ten alınan renklerle çizin

bir MWE var:

enter image description here yerine tüm histogram için green olmanın renk

, bir renk-takip etmek sütunları istiyorum: Bu çıkışı

import numpy as n 
import matplotlib.pyplot as plt 

# Random gaussian data. 
Ntotal = 1000 
data = 0.05 * n.random.randn(Ntotal) + 0.5 

# This is the colormap I'd like to use. 
cm = plt.cm.get_cmap('RdYlBu_r') 

# Plot histogram. 
n, bins, patches = plt.hist(data, 25, normed=1, color='green') 

plt.show() 

cm'da tanımlanan colormap tarafından verilen kodlama ve bins'un değerleri. Bu, RdYlBu_r seçilen renk eşlemesine göre, daha yakın kutulara (değil, değil, ancak konum) mavi ve daha kırmızı olanlara daha yakın görünmesi anlamına gelir.

plt.histo bir cmap argümanını almıyor cm içinde tanımlanan colormap'i nasıl kullanacağımı bilmiyorum.

cevap

28

hist komut yamalar bir listesini verir, bu yüzden bu kadar gibi onların rengini üzerlerinden yineleme ve ayarlayabilirsiniz:

import numpy as n 
import matplotlib.pyplot as plt 

# Random gaussian data. 
Ntotal = 1000 
data = 0.05 * n.random.randn(Ntotal) + 0.5 

# This is the colormap I'd like to use. 
cm = plt.cm.get_cmap('RdYlBu_r') 

# Plot histogram. 
n, bins, patches = plt.hist(data, 25, normed=1, color='green') 
bin_centers = 0.5 * (bins[:-1] + bins[1:]) 

# scale values to interval [0,1] 
col = bin_centers - min(bin_centers) 
col /= max(col) 

for c, p in zip(col, patches): 
    plt.setp(p, 'facecolor', cm(c)) 

plt.show() 

renkleri elde etmek için, call the colormap with a value between 0 and 1 gerekir. Ortaya çıkan rakam:

enter image description here

+0

gibi olur - Imgur _not_ engellenirse işim öyleyse geldim ve resmini ekledim. Her iki yaklaşımın da bu soruya iyi çözümler olduğunu düşünüyorum! – Hooked

+0

Mmm görüntü doğruysa, kod ihtiyacım olanı yapmıyor. Renk kodlaması _heigth_ çubuklarıyla ilişkilidir ve buna _bins value_ ile ilişkili olması gerekir. Ne demek istediğimi görmek için @Hooked yanıtlayana bakın. – Gabriel

+0

Bunu daha açık yapmak için soruyu düzenledim. – Gabriel

12

alternatif bir yaklaşım renk listesinde alır plt.bar kullanmaktır. Genişlikleri ve yükseklikleri belirlemek için numpy.histogram'u kullanabilirsiniz. Eğer, ne istedi olmasa da senin renk haritası x değer aralığını bulma ve 1.

import numpy as n 
import matplotlib.pyplot as plt 

# Random gaussian data. 
Ntotal = 1000 
data = 0.05 * n.random.randn(Ntotal) + 0.5 

# This is the colormap I'd like to use. 
cm = plt.cm.get_cmap('RdYlBu_r') 

# Get the histogramp 
Y,X = n.histogram(data, 25, normed=1) 
x_span = X.max()-X.min() 
C = [cm(((x-X.min())/x_span)) for x in X] 

plt.bar(X[:-1],Y,color=C,width=X[1]-X[0]) 
plt.show() 

enter image description here

1

0'dan onları ölçekleme tarafından kullanılıp kullanılamayacağını bu genelinde başkası sendeler , Baş'ın Yanıta göre aşağıdaki kod çalışacak yerine düzenin kutuları yüksekliği tarafından renklerini yapmaya yol arıyoruz (gibi did):

import numpy as np 
import matplotlib.pyplot as plt 

Ntotal = 1000 
data = 0.05 * np.random.randn(Ntotal) + 0.5 
cm = plt.cm.get_cmap('RdYlBu_r') 

n, bins, patches = plt.hist(data, 25, normed=1, color='green') 
# To normalize your values 
col = (n-n.min())/(n.max()-n.min()) 
for c, p in zip(col, patches): 
    plt.setp(p, 'facecolor', cm(c)) 
plt.show() 

enter image description here

0

I Bas Swinckels cevabı gibi ama renk haritası cm parametre olarak 0 ile 1 arasında bir değer alması göz önüne alındığında, daha basit bir algoritma ben sakıncası yoktur umarım bu

import matplotlib.pyplot as plt 

Ntotal = 1000 
data = 0.05 * n.random.randn(Ntotal) + 0.5 

cm = plt.cm.RdBu_r 

n, bins, patches = plt.hist(data, 25, normed=1, color='green') 
for i, p in enumerate(patches): 
    plt.setp(p, 'facecolor', cm(i/25)) # notice the i/25 

plt.show()