2014-02-06 3 views
1

У меня есть набор из N объектов с двумя свойствами: x и y. Я хотел бы изобразить распределение x с гистограммой в MATPLOTLIB с помощью hist(). Достаточно легко. Теперь я хочу, чтобы цветной код EACH bar гистограммы имел цвет, который представляет среднее значение y в этом наборе с цветовой палитрой. Есть простой способ сделать это? Здесь x и y являются массивами N-d numpy. Благодаря!Цветовое кодирование гистограммы

fig = plt.figure() 
n, bins, patches = plt.hist(x, 100, normed=1, histtype='stepfilled') 
plt.setp(patches, 'facecolor', 'g', 'alpha', 0.1) 
plt.xlabel('x') 
plt.ylabel('Normalized frequency') 
plt.show() 
+1

Вы захватив объект 'patches' вернулся, вы не можете просто перебирать, что на основе' bins' и установить цвета, как вы считаете нужным? –

+0

Итак, мне пришлось бы вручную проверять каждый из N объектов, для которых они находятся, записать там y и в конечном итоге взять средний y для определения цвета? – Cokes

+0

Что-то в этом роде; во-первых, я бы, вероятно, объединил x и y в один массив, а затем отсортировал его по x. После этого выполните итерацию по данным, суммируя y, затем усредняя и раскрашивая, когда вы видите x пересекаете границу бина. –

ответ

1
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
# set up the bins 
Nbins = 10 
bins = np.linspace(0, 1, Nbins +1, endpoint=True) 
# get some fake data 
x = np.random.rand(300) 
y = np.arange(300) 
# figure out which bin each x goes into 
bin_num = np.digitize(x, bins, right=True) - 1 
# compute the counts per bin 
hist_vals = np.bincount(bin_num) 
# set up array for bins 
means = np.zeros(Nbins) 
# numpy slicing magic to sum the y values by bin 
means[bin_num] += y 
# take the average 
means /= hist_vals 

# make the figure/axes objects 
fig, ax = plt.subplots(1,1) 
# get a color map 
my_cmap = cm.get_cmap('jet') 
# get normalize function (takes data in range [vmin, vmax] -> [0, 1]) 
my_norm = Normalize() 
# use bar plot 
ax.bar(bins[:-1], hist_vals, color=my_cmap(my_norm(means)), width=np.diff(bins)) 

# make sure the figure updates 
plt.draw() 
plt.show() 

родственный: vary the color of each bar in bargraph using particular value

+0

«Правильный» вариант оцифровки доступен на моей машине Ubuntu, но не на моем Mac ... Хммм. с: http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html без: http://docs.scipy.org/doc/numpy-1.6.0/reference/generated /numpy.digitize.html – Cokes

+0

Обратите внимание на версии, 1.8 против 1.6. Обновите свой mac;) – tacaswell

+0

Смотрите http://stackoverflow.com/questions/21619347/creating-a-python-histogram-without-pylab/21632623#21632623, вы можете реплицировать функцию 'digitize' одним проходом через' x' – tacaswell

Смежные вопросы