Python统计数组中多个区间内的频数并画直方图

目录

需求

给定一个数据数组或列表,如[1, 2, 2, 3, 5, 5, 7, 7.5, 9.5, 10] ,然后给定一个区间数组:[0, 4, 8, 10],要求依次统计数据数组在(0, 4](4, 8]以及(8, 10]三个区间内各自出现的频数,并画出直方图。

实现

首先随机生成0到10之间的100个整数:

data = np.random.randint(low=1, high=10 + 1, size=100, dtype='int')
print(data)

输出:

[ 8  7  1  9  8  7  8  7  7  8  3  6 10 10  9  2  2 10  1  2  2  6  6  2
  7  4  5  5  8  6  5  4  3  2  8  4  3  5 10  5  9  6  4  5  4  2  8  9
  7  8  7  9  7  4  2  7  7  6  3  3  6  7  8  1 10  7  7 10  4  4  6  4
  5  5 10  7  1  2  8  4  6  8  9  9  6  4  9  5  6  4  4 10  2  6  9  3
  4  8  4  9]

统计频数用pandascut函数可以很轻松地实现:

s = pd.cut(data, bins=[x for x in range(10 + 1)])
print(s.value_counts())

其中bins表示区间数据。如前文所述,如果bins=[0, 4, 8, 10],那么就是统计data(0, 4](4, 8]以及(8, 10]三个区间内各自出现的频数。

统计结果输出:

(0, 1]      9
(1, 2]      7
(2, 3]      7
(3, 4]      4
(4, 5]     12
(5, 6]     10
(6, 7]     14
(7, 8]      9
(8, 9]     18
(9, 10]    10
dtype: int64

然后获取频数:

values = s.value_counts().values
print(values)
[ 7  9 12 10  9 11 10 13  7 12]

获取横轴标签:

labels = [str(i) + '-' + str(i+1) for i in range(int(np.max(data)))]
print(labels)
['0-1', '1-2', '2-3', '3-4', '4-5', '5-6', '6-7', '7-8', '8-9', '9-10']

最后,生成dataframe并画图:

df = pd.DataFrame(values, index=labels)
df.plot(kind='bar', legend=False)
plt.xticks(rotation=0)
plt.ylabel('频数')
plt.xlabel('区间')
plt.show()

结果:
在这里插入图片描述

  • 22
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来回答你的问题。 首先是数分布直方图的实现。 Python可以使用matplotlib库来实现数分布直方图。下面是一个简单的例子: ```python import matplotlib.pyplot as plt import numpy as np # 生成随机数据 data = np.random.randn(1000) # 绘制直方图 plt.hist(data, bins=30, density=True) # 显示图形 plt.show() ``` 其,`data`是我们要绘制直方图的数据,`bins`表示直方图的柱子数量,`density=True`表示将直方图转换为概率密度图。 接下来是拆分多个正态分布曲线的实现。 可以使用scipy库的`stats`模块来实现正态分布曲线的拟合。下面是一个简单的例子: ```python import matplotlib.pyplot as plt import numpy as np from scipy.stats import norm # 生成随机数据 data = np.concatenate([np.random.normal(-1, 1, 500), np.random.normal(2, 0.5, 500)]) # 绘制直方图 plt.hist(data, bins=30, density=True) # 拟合正态分布曲线 mu1, std1 = norm.fit(data[data < 0]) mu2, std2 = norm.fit(data[data >= 0]) # 绘制正态分布曲线 x = np.linspace(-5, 5, 1000) y1 = norm.pdf(x, mu1, std1) y2 = norm.pdf(x, mu2, std2) plt.plot(x, y1, label='Norm 1') plt.plot(x, y2, label='Norm 2') # 显示图形 plt.legend() plt.show() ``` 其,`data`是我们要拟合正态分布曲线的数据,`norm.fit`方法返回拟合出的正态分布的均值和标准差,`norm.pdf`方法用于计算正态分布曲线上的点的纵坐标。 希望以上内容对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值