Matplotlib 中的斌大小(直方图)

我在用 matplotlib 做一个直方图。

有没有办法手动设定垃圾桶的大小而不是垃圾桶的数量?

385380 次浏览

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

实际上,这很简单: 你可以给出一个带有垃圾箱边界的列表,而不是垃圾箱的数量。它们也可能是不平等分配的:

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

如果你只是想让它们平均分布,你可以简单地使用 range:

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

增加了原始答案

上面的代码行只适用于填充整数的 data。正如 宏观世界指出的,对于浮点数,您可以使用:

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

对于 N 个容器,容器边缘由 N + 1值列表指定,其中第一个 N 表示较低的容器边缘,而 + 1表示最后一个容器的上边缘。

密码:

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 个箱子

我和 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-我特别创建了一个数字,它在 bins 参数中设置的范围之间。

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

  • 数字1(来自第一个数组)介于0和10之间(在‘ bins’数组中)
  • 数字11(来自第一个数组)介于11和20之间(在“ bins”数组中)
  • 数字21(来自第一个数组)介于21和30之间(在‘ bins’数组中) ,等等。

然后我使用‘ weight’参数来定义每个容器的大小。这是用于 weight 参数的数组: [10,1,40,33,6]。

所以0到10个容器的值是10,11到20个容器的值是1,21到30个容器的值是40,等等。

对于整数 x 值的直方图,我最后使用

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

偏移量0.5使箱子在 x 轴值上居中。

我喜欢事情自动发生,喜欢垃圾桶落在“好”的价值观上。下面这些看起来效果不错。

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
min_val = np.min(data)
max_val = np.max(data)
min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
bins = np.linspace(min_boundary, max_boundary, n_bins)
return bins


if __name__ == '__main__':
data = np.random.random_sample(100) * 123.34 - 67.23
bins = compute_histogram_bins(data, 10.0)
print(bins)
plt.hist(data, bins=bins)
plt.xlabel('Value')
plt.ylabel('Counts')
plt.title('Compute Bins Example')
plt.grid(True)
plt.show()

结果在很好的箱大小间隔上有箱子。

[-70. -60. -50. -40. -30. -20. -10.   0.  10.  20.  30.  40.  50.  60.]

computed bins histogram

我使用分位数来制作统一的箱子,并且适合样品:

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

这个答案支持@macrocosme 建议。

我正在使用热图作为组成部分。此外,我使用 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

如果您也在关注可视化方面,那么可以添加 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