使用Python中的numpy和scipy在matplotlib中制作装箱箱图

使用Python中的numpy和scipy在matplotlib中制作装箱箱图,python,numpy,matplotlib,scipy,plot,Python,Numpy,Matplotlib,Scipy,Plot,我有一个包含成对值的二维数组,我想通过不同的x值箱绘制y值的箱线图。即,如果阵列为: my_array = array([[1, 40.5], [4.5, 60], ...]]) 然后我想对我的_数组[:,0]进行装箱,然后为每个箱子生成一个对应于每个箱子中的我的_数组[:,1]值的箱线图。所以最后,我希望这个图包含很多箱子,很多箱子 我尝试了以下方法: min_x = min(my_array[:, 0]) max_x = max(my_array[:, 1]) num_bins = 3

我有一个包含成对值的二维数组,我想通过不同的x值箱绘制y值的箱线图。即,如果阵列为:

my_array = array([[1, 40.5], [4.5, 60], ...]])
然后我想对我的_数组[:,0]进行装箱,然后为每个箱子生成一个对应于每个箱子中的我的_数组[:,1]值的箱线图。所以最后,我希望这个图包含很多箱子,很多箱子

我尝试了以下方法:

min_x = min(my_array[:, 0])
max_x = max(my_array[:, 1])

num_bins = 3
bins = linspace(min_x, max_x, num_bins)
elts_to_bins = digitize(my_array[:, 0], bins)
但是,这给了我从1到3的elts_到_的值。我想我应该为垃圾箱获取基于0的索引,我只想要3个垃圾箱。我假设这是由于linspace和digitalize中表示垃圾箱的方式有些棘手

最简单的方法是什么?我想要num_bin—许多等距的bin,第一个bin包含数据的下半部分,而上一个bin包含数据的上半部分。。。i、 例如,我希望每个数据点都落入某个箱子中,这样我就可以制作一个箱线图


谢谢。

您得到的是数组中最大值的第三个bin(我假设您有一个输入错误,max_x应该是“max(my_数组[:,0])”而不是“max(my_数组[:,1])”)。您可以通过在最后一个箱子中添加1(或任何正数)来避免这种情况

另外,如果我理解正确,您希望一个变量一个变量地存储,因此下面的示例显示了这一点。如果您使用的是recarray(速度要慢得多),那么matplotlib.mlab(例如mlab.rec_groupby等)中也有几个函数可以执行这类操作

无论如何,最后,您可能会遇到类似的情况(假设x和y的长度相同,通过y中的值来存储x)

举个简单的例子:

In [3]: x = np.random.random((100, 2))

In [4]: binned_values, bins = bin_by(x[:,0], x[:,1], 2)

In [5]: binned_values
Out[5]: 
[array([ 0.59649575,  0.07082605,  0.7191498 ,  0.4026375 ,  0.06611863,
        0.01473529,  0.45487203,  0.39942696,  0.02342408,  0.04669615,
        0.58294003,  0.59510434,  0.76255006,  0.76685052,  0.26108928,
        0.7640156 ,  0.01771553,  0.38212975,  0.74417014,  0.38217517,
        0.73909022,  0.21068663,  0.9103707 ,  0.83556636,  0.34277006,
        0.38007865,  0.18697416,  0.64370535,  0.68292336,  0.26142583,
        0.50457354,  0.63071319,  0.87525221,  0.86509534,  0.96382375,
        0.57556343,  0.55860405,  0.36392931,  0.93638048,  0.66889756,
        0.46140831,  0.01675165,  0.15401495,  0.10813141,  0.03876953,
        0.65967335,  0.86803192,  0.94835281,  0.44950182]),
 array([ 0.9249993 ,  0.02682873,  0.89439141,  0.26415792,  0.42771144,
        0.12292614,  0.44790357,  0.64692616,  0.14871052,  0.55611472,
        0.72340179,  0.55335053,  0.07967047,  0.95725514,  0.49737279,
        0.99213794,  0.7604765 ,  0.56719713,  0.77828727,  0.77046566,
        0.15060196,  0.39199123,  0.78904624,  0.59974575,  0.6965413 ,
        0.52664095,  0.28629324,  0.21838664,  0.47305751,  0.3544522 ,
        0.57704906,  0.1023201 ,  0.76861237,  0.88862359,  0.29310836,
        0.22079126,  0.84966201,  0.9376939 ,  0.95449215,  0.10856864,
        0.86655289,  0.57835533,  0.32831162,  0.1673871 ,  0.55742108,
        0.02436965,  0.45261232,  0.31552715,  0.56666458,  0.24757898,
        0.8674747 ])]
希望对你有所帮助

Numpy提供了一种创建直方图的方法,您需要:

histogram(a, bins=10, range=None, normed=False, weights=None, new=None)
您可以像这样使用:

(hist_data, bin_edges) = histogram(my_array[:,0], weights=my_array[:,1])
这里的关键点是使用
weights
参数:每个值
a[i]
weights[i]
贡献到直方图中。例如:

a = [0, 1]
weights = [10, 2]
描述了x=0时的10个点和x=1时的2个点

您可以使用
bins
参数设置存储箱的数量或存储箱限制(有关详细信息,请参阅)

然后,可以使用以下内容绘制直方图:

bar(bin_edges[:-1], hist_data)
如果只需要进行直方图绘制,类似功能可以直接绘制直方图:

hist(my_array[:,0], weights=my_array[:,1])

我不明白为什么在看完文件后这里用“重量”——你能解释一下吗?如果问题仅仅是将元素分配给容器,我不明白为什么权重应该起作用。我编辑了答案,以便更详细地解释权重参数的作用。如果你认为这个答案有用,请用拇指把它竖起来!:)不幸的是,np.histogram不能满足他的需要。他需要每个箱子的实际值,以便为每个箱子绘制箱线图。(或者这是我的理解,不管怎样,如果我错了,请纠正我!)权重参数只是将每个值乘以每个权重,这样,它就可以添加权重[I],而不是将1添加到箱子中的计数中。这与用另一个数组中的值对一个数组进行装箱不同,而且不管怎样,都不会返回落入每个箱子中的数组子集。(或者我完全误解了事情?)@Joe:我明白你的意思。无论答案是什么,我们的回答中应该有一个是正确的,因此它们都是有用的
hist(my_array[:,0], weights=my_array[:,1])