matplotlib绘制频率分布直方图
1.给了数据,让统计这些数据的分布
from matplotlib import pyplot as plt
from matplotlib import rcParams
import random as r# 直方图用来统计每个区间数量多少rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(20,8), dpi=80)# 生成数据,这里用正态分布来生成数据
# 均值和标准差,均值就是大部分数据集中在哪,标准差越大数据越离散,越少数据越单一
a = [int(r.gauss(100, 20)) for _ in range(100000)]
d = 3# 构造 bins,保证每个区间长度为 d
# 最小值到最大值+d,取一个步长,相当于向上取整
# 这样生成的区间恰好能覆盖所有数
bins = list(range(min(a), max(a) + d, d))# 绘制直方图(edgecolor 参数让柱子边框更清晰)
# 直接指定bins,有原始数据的时候
plt.hist(a, bins, edgecolor='black',density=True)# 将 x 轴刻度设为 bins 列表,即柱子的左右边界
plt.xticks(bins)plt.grid()
plt.show()
2.只给了频数
from matplotlib import pyplot as plt
from matplotlib import rcParams
import random as r
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False#区间左边界,区间宽度,频数
interval=[0,5,10,15,20,25,30,35,40,45,60,90]
width=[5,5,5,5,5,5,5,5,5,15,30,60]
quantity=[836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]plt.figure(figsize=(20, 6))# 使用 plt.bar 绘制直方图:柱子的左边界由 interval 指定,
# 柱子宽度由 width 指定,高度为对应的频数 quantity
right_boundaries = [iv + wd for iv, wd in zip(interval, width)]
print(right_boundaries)
# 合并左边界和右边界,并去重排序(注意:一般两个列表内的数互不重合,可直接拼接)
all_boundaries = sorted(interval + right_boundaries)# 使用 align='edge' 使每个柱子从其左边界开始绘制,width 设置柱子宽度
plt.bar(interval, quantity, width=width, align='edge', edgecolor='black')# 设置 x 轴刻度为所有边界,这样每个柱子的左右两侧都能看到刻度
plt.xticks(all_boundaries)plt.xlabel("区间")
plt.ylabel("频数")
plt.title("直方图")
plt.grid()# 显示图形
plt.show()
效果