2013-04-27 89 views
0

我有数据在数组x,y和w其中'x'和'y'表示位置和'w'是权重1或0表示成功或失败。我试图创建一个2d直方图,其中根据该bin中成功的百分比(即bin中的成功次数除以bin中的总点数)对直方图的每个bin进行着色。我已经玩了很多numpy.histogram2d,可以得到密度图,但这与我所瞄准的成功计划的百分比不一样。请注意,在numpy.histogram2d参数中normed = True并不能缓解这个问题。 (为了说明不同之处,如果箱内的成功次数较多,密度图将显示较大的“颜色值”,而不管同一箱中有多少故障,我想得到百分比的成功,所以在同一个箱子中的大量失败会给一个较小的'颜色值',对于较差的术语我很抱歉)。Python 2d-直方图成功率每个bin

非常感谢任何能够帮助的人!当前代码

的例子,没有做什么我的目标:

import matplotlib.pyplot as plt 
import numpy as np 
plt.figure(1) 
H, xedges, yedges = np.histogram2d(x, y, bins=50, weights=w, normed=True) 
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]] 
plt.imshow(H, extent=extent,interpolation='nearest') 
plt.colorbar() 
plt.show() 

回答

3

我敢肯定这个工作,但你不给的数据,所以很难检查。 normed=True为您提供了密度,如果您没有通过normed=True,您会得到加权样本计数,所以如果您将加权版本(实际上每个bin的#successes)由未加权(每个bin中的元素数)分开,最终取得成功。

import matplotlib.pyplot as plt 
import numpy as np 
plt.figure(1) 
H, xedges, yedges = np.histogram2d(x, y, bins=50, weights=w) 
H2, _, _ = np.histogram2d(x,y, bins=50) 
extent = [0,1, xedges[-1], xedges[0]] 
plt.imshow(H/H2, extent=extent,interpolation='nearest') 
plt.colorbar() 
plt.show() 

这可能最终直方图离开nan,所以你可能想为这些案件的决定。

+0

神奇,像魅力一样工作。非常感谢你!我实际上使用了上面写的下划线,你介意解释这些做什么(我的假设是它允许计算H2而不用重新计算xedges和yedges)。 – 2013-04-27 14:25:51

+0

@ Dr.Jones它没有做任何特别的事情...... np.histogram2d的输出是一个包含三个元素的元组;然而,开箱时经常使用_表示你不关心那个元素。 xedges和yedges不会根据权重而改变,因此再次保留它们并不重要。要真正看到这个工作,试试'lst = [1,2,3]; a,b,c = 1st;打印b;打印c; d,b,b = 1st;打印b;'(当你不能做多行时很难显示),但基本上发生的是,你分配给b两次,只有最后一次分配。 – 2013-04-27 18:39:18