我在用 matplotlib 做一个直方图。
有没有办法手动设定垃圾桶的大小而不是垃圾桶的数量?
我想最简单的方法是计算你所拥有的数据的最小值和最大值,然后计算 L = max - min。然后将 L除以所需的容器宽度(我假设这就是您所说的容器大小) ,并使用此值的上限作为容器数。
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。正如 宏观世界指出的,对于浮点数,您可以使用:
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]);
这就造成了这样的结果:
所以第一个参数基本上是“初始化”bin-我特别创建了一个数字,它在 bins 参数中设置的范围之间。
为了演示这一点,请查看第一个参数中的数组([1,11,21,31,41])和第二个参数中的‘ bins’数组([0,10,20,30,40,50]) :
然后我使用‘ 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.]
我使用分位数来制作统一的箱子,并且适合样品:
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')
这个答案支持@macrocosme 建议。
我正在使用热图作为组成部分。此外,我使用 cmin = 0.5表示无计数值,使用 cmap 表示颜色,r 表示给定颜色的反面。
描述一下统计数据。
# 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();
如果您也在关注可视化方面,那么可以添加 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)