上节课我们讲述了条形图的绘制,本节课我们来讲述直方图的绘制。
# 1.什么是直方图?
直方图,又称质量分布图,用于表示数据的分布情况,是一种常见的统计图表。一般用横轴表示数据区间,纵轴表示分布情况,柱子越高,则落在该区间的数量越大。直方图和条形图的外观相似。区别主要有以下几点:
1. 条形图用条形的长度(横置时)或高度(纵置时)表示各类别频数的多少,其宽度(表示类别)则是固定的;直方图是用面积表示各组频数的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义。
2. 由于分组数据具有连续性,直方图的各矩形通常是连续排列,而条形图则是分开排列。
3. 条形图主要用于展示分类数据的大小,而直方图则主要用于展示数值型数据的分布。
2
3
# 2.直方图的绘制
下面我们就通过例子来看下直方图的绘制。
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
plt.hist(ages, bins=5)
plt.title('人员的年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面的代码中,通过调用 hist 函数来绘制直方图,bins 参数的含义是将整体数据分到几个区间内,在本例中,设置 bins = 5,表示将 ages 中的数据划分到 5 个区间内。执行完上述代码后生成的图形如下图所示:
直方图的高度表示每个区间的人数,虽然代码将数据划分到 5 个区间,但是从图形并不能明显看出每个区间的范围,下面我们为相邻区间加上一个分隔线,例如:
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
plt.hist(ages, bins=5, edgecolor='black')
plt.title('人员的年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面的代码中,我们通过设置参数 edgecolor 为相邻区间加上了一个分隔线,加上分隔线之后的图形如下图所示: 上面的例子中,我们在调用 hist 方法时,只传入了需要划分的区间的个数,并没有规定每个区间的范围,区间范围的划定是自动进行的,当然,我们也可以通过参数来明确指定每个区间的范围。例如:
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
bins = [10, 20, 30, 40, 50, 60]
plt.hist(ages, bins=bins, edgecolor='black')
plt.title('人员的年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在上面的代码中,我们通过一个列表来指定各个区间的范围,总共划分了 5 个区间,区间的范围分别是[10,20),[20,30),[30,40),[40,50),[50,60)。年龄在 [10,20) 区间内的人数为 2,在 [20,30) 区间内的人数为 4,在 [30,40) 区间内的人数为 3,在 [40,50) 区间内的人数为 1,在 [50,60) 区间内的人数为 1。执行完上述代码后生成的图形如下图所示: 手动指定区间的好处是,如果我们不想要某个区间的数据,直接在 bins 参数中去掉就可以了。例如:
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
bins = [20, 30, 40, 50, 60]
plt.hist(ages, bins=bins, edgecolor='black')
plt.title('人员的年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在上面的代码中,我们去掉了 [10,20) 这个区间,得到的图形如下图所示: 由于直方图描述的是数据的分布,有时候我们需要画出平均值的位置,例如:
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
bins = [10, 20, 30, 40, 50, 60]
plt.hist(ages, bins=bins, edgecolor='black')
avg_age = 30.5
plt.axvline(avg_age, color='red', linewidth=2, label='平均值')
plt.title('人员的年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.legend()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
在上面的代码中,我们通过 axvline 来画出表示平均值的一条垂直的线,得到的图形如下图所示: 在上图中,垂直的红线代表的是平均值。
# 3.应用场景
# 3.1 适用场景
1. 房价分布
2. 人口年龄分布
2
# 4.总结
本节课我们讲述了直方图的绘制以及直方图的适用场景。