2013-06-21 2 views
4

Скажите, что я хочу построить гистограмму данных частиц, которая сглаживается над некоторым диапазоном bin, nbin. Теперь у меня есть 5 наборов данных с частицами различной массы (каждый набор x, y имеет другую массу). Как правило, гистограмма позиций частиц является простым случаем (с использованием NumPy):Создайте сложную двумерную гистограмму с использованием разных весов

heatmap, xedges, yedges = np.histogram2d(x, y, bins=nbin) 
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] 
heatmap = np.flipud(np.rot90(heatmap)) 
ax.imshow(heatmap, extent=extent) 

Однако, если я хочу, чтобы добавить следующие много частиц, они имеют разные массы и, следовательно, плотность будет отличаться. Есть ли способ весить гистограмму некоторой константой, так что построенная графика будет истинным представлением плотности, а не просто бининга всего числа частиц?

Я знаю, что «вес» - это особенность, но это случай только установки весов = m_i, где m_i - масса частицы для каждого набора данных 1-5?

+0

Да, это должно очень многое сделать трюк. – Jaime

ответ

4

Параметр weights ожидает массив той же длины, что и x, и y. np.histogram2d. Он не будет транслировать постоянное значение, так что даже если она одинакова для каждого вызова np.histogram2d, вы должны использовать что-то вроде

weights=np.ones_like(x)*mass 

Теперь, одна проблема, вы можете столкнуться, если вы используете bin=nbin является то, что края корзины, xedges, yedges могут меняться в зависимости от значений x и y, которые вы переходите на np.histogram2d. Если вы наивно добавляете карты тепла вместе, конечный результат будет накапливать плотность частиц в неправильных местах.

Поэтому, если вы хотите позвонить np.histogram2d несколько раз и добавить частичные карты отопления вместе, вы должны заранее определить, где вы хотите края бункера.

Например:

import numpy as np 
import itertools as IT 
import matplotlib.pyplot as plt 
N = 50 
nbin = 10 

xs = [np.array([i,i,i+1,i+1]) for i in range(N)] 
ys = [np.array([i,i+1,i,i+1]) for i in range(N)] 
masses = np.arange(N) 

heatmap = 0 
xedges = np.linspace(0, N, nbin) 
yedges = np.linspace(0, N, nbin) 

for x, y, mass in IT.izip(xs, ys, masses): 
    hist, xedges, yedges = np.histogram2d(
     x, y, bins=[xedges, yedges], weights=np.ones_like(x)*mass) 
    heatmap += hist 

extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] 
heatmap = np.flipud(np.rot90(heatmap)) 
fig, ax = plt.subplots() 
ax.imshow(heatmap, extent=extent, interpolation='nearest') 
plt.show() 

дает

enter image description here

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