项目中在前期经常要看下数据的分布情况,这对于探究数据规律非常有用。概率分布表示样本数据的模样,长的好不好看如果有图像展示出来就非常完美了,使用Python绘制频率分布直方图非常简洁,因为用的频次非常高,这里记录下来。还是Python大法好,代码简洁不拖沓~
如果数据取值的范围跨度不大,可以使用等宽区间来展示直方图,这也是最常见的一种;如果数据取值范围比较野,也可以自定义区间端点,绘制图像,下面分两种情况展示
1. 区间长度相同绘制直方图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#-*- encoding=utf-8 -*-
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
zhfont1 = matplotlib.font_manager.FontProperties(fname = 'C:\Windows\Fonts\simsun.ttc' )
# 按照固定区间长度绘制频率分布直方图
# bins_interval 区间的长度
# margin 设定的左边和右边空留的大小
def probability_distribution(data, bins_interval = 1 , margin = 1 ):
bins = range ( min (data), max (data) + bins_interval - 1 , bins_interval)
print ( len (bins))
for i in range ( 0 , len (bins)):
print (bins[i])
plt.xlim( min (data) - margin, max (data) + margin)
plt.title( "probability-distribution" )
plt.xlabel( 'Interval' )
plt.ylabel( 'Probability' )
plt.hist(x = data, bins = bins, histtype = 'bar' , color = [ 'r' ])
plt.show()
|
2. 区间长度不同绘制直方图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#-*- encoding=utf-8 -*-
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
zhfont1 = matplotlib.font_manager.FontProperties(fname = 'C:\Windows\Fonts\simsun.ttc'
# 自己给定区间,小于区间左端点和大于区间右端点的统一做处理,对于数据分布不均很的情况处理较友好
# bins 自己设定的区间数值列表
# margin 设定的左边和右边空留的大小
# label 右上方显示的图例文字
"""e
import numpy as np
data = np.random.normal(0, 1, 1000)
bins = np.arange(-5, 5, 0.1)
probability_distribution_extend(data=data, bins=bins)
"""
def probability_distribution_extend(data, bins, margin = 1 , label = 'Distribution' ):
bins = sorted (bins)
length = len (bins)
intervals = np.zeros(length + 1 )
for value in data:
i = 0
while i < length and value > = bins[i]:
i + = 1
intervals[i] + = 1
intervals = intervals / float ( len (data))
plt.xlim( min (bins) - margin, max (bins) + margin)
bins.insert( 0 , - 999 )
plt.title( "probability-distribution" )
plt.xlabel( 'Interval' )
plt.ylabel( 'Probability' )
plt.bar(bins, intervals, color = [ 'r' ], label = label)
plt.legend()
plt.show()
|
Case示例
1
2
3
|
if __name__ = = '__main__' :
data = [ 1 , 4 , 6 , 7 , 8 , 9 , 11 , 11 , 12 , 12 , 13 , 13 , 16 , 17 , 18 , 22 , 25 ]
probability_distribution(data = data, bins_interval = 5 ,margin = 0 )
|
效果如下图
以上这篇Python绘制频率分布直方图的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/whgyxy/article/details/88713917