Matplotlib中的Bin大小(直方图)

时间:2011-08-08 18:46:05

标签: python matplotlib histogram

我正在使用matplotlib制作直方图。

基本上,我想知道是否有办法手动设置垃圾箱的大小而不是垃圾箱的数量。

任何有任何想法的人都非常感谢。

由于

8 个答案:

答案 0 :(得分:217)

实际上,它非常简单:您可以使用bin边界列出bin,而不是bin的数量。它们也可能分布不均:

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

如果您只是希望它们分布均匀,您只需使用范围:

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

添加到原始回答

以上行适用于仅填充整数的data。正如macrocosme指出的那样,对于花车你可以使用:

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))

答案 1 :(得分:13)

对于N个bin,bin边缘由N + 1个值列表指定,其中前N个给出较低的bin边缘,+1给出最后一个bin的上边缘。

代码:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

请注意,linspace产生的数组从min_edge到max_edge分为N + 1个值或N个bin

答案 2 :(得分:4)

我想简单的方法是计算您拥有的数据的最小值和最大值,然后计算L = max - min。然后将L除以所需的bin宽度(我假设这是你的bin大小的意思)并使用该值的上限作为bin的数量。

答案 3 :(得分:1)

我和OP有同样的问题(我想!),但我无法按照Lastalda指定的方式工作。我不知道我是否正确地解释了这个问题,但我找到了另一个解决方案(尽管这可能是一个非常糟糕的方法)。

这就是我这样做的方式:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

创造了这个:

image showing histogram graph created in matplotlib

所以第一个参数基本上是'初始化' bin - 我专门创建一个介于我在bin参数中设置的范围之间的数字。

为了证明这一点,请查看第一个参数([1,11,21,31,41])中的数组和' bins'第二个参数中的数组([0,10,20,30,40,50]):

  • 数字1(来自第一个数组)介于0到10之间(在' bins'数组中)
  • 数字11(来自第一个数组)介于11到20之间(在' bins'数组中)
  • 数字21(来自第一个数组)介于21到30之间(在' bins'数组中)等。

然后我使用'权重'用于定义每个bin大小的参数。这是用于权重参数的数组:[10,1,40,33,6]。

因此0到10 bin的值为10,11到20 bin的值为1,21到30 bin的值为40,等等。

答案 4 :(得分:0)

I use quantiles to do bins uniform and fitted to sample:

bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()

plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

enter image description here

答案 5 :(得分:0)

此答案支持@ macrocosme建议。

我正在使用热图作为hist2d图。另外,我将cmin = 0.5用作无计数值,将cmap用作颜色,r代表给定颜色的反色。

描述统计信息。 enter image description here

# np.arange(data.min(), data.max()+binwidth, binwidth)
bin_x = np.arange(0.6, 7 + 0.3, 0.3)
bin_y = np.arange(12, 58 + 3, 3)
plt.hist2d(data=fuel_econ, x='displ', y='comb', cmin=0.5, cmap='viridis_r', bins=[bin_x, bin_y]);
plt.xlabel('Dispalcement (1)');
plt.ylabel('Combine fuel efficiency (mpg)');

plt.colorbar();

enter image description here

答案 6 :(得分:-1)

对于具有整数x值的直方图,我最终使用

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

0.5的偏移量使箱体在x轴值上居中。 plt.xticks调用会为每个整数添加一个勾号。

答案 7 :(得分:-1)

如果您也在查看可视化方面,您可以添加 edgecolor='white', linewidth=2 并将分箱分隔:

date_binned = new_df[(new_df['k']>0)&(new_df['k']<360)]['k']
plt.hist(date_binned, bins=range(min(date_binned), max(date_binned) + binwidth, binwidth), edgecolor='white', linewidth=2)

enter image description here