您的位置:

详解matplotlib直方图

一、基本概念

直方图是一种常用的数据可视化方式,用于描述定量数据的分布情况。它将数据按照大小分成若干个等距的区间,然后用柱状图表示每个区间内数据的频数或频率。

具体而言,直方图包含以下几个重要的概念:

数据:待处理的数据,可以是一维数组或列表;

区间:将数据划分成若干个相邻且等距的区间,可以使用numpy库中的linspace函数生成;

频数:每个区间内数据的个数;

频率:每个区间内数据个数占总体数据个数的比例;

柱状图:用矩形条表示每个区间的频数或频率,柱状图的高度反映了区间内数据的多少。

二、绘制基本直方图

在matplotlib中使用hist函数可以绘制基本的直方图。函数的常用参数包括:

x:一维数组或列表,表示原始数据;

bins:整数或序列,表示数据分段的方式;

density:布尔类型,默认为False,表示是否归一化;

下面的代码展示了如何绘制简单的直方图:

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 绘制直方图
plt.hist(data, bins=30, density=True, alpha=0.5)
plt.title('Basic Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

上述代码首先使用numpy库生成了一个均值为0,标准差为1的随机数据,然后使用hist函数将其绘制成直方图。其中,bins参数为30表示将数据分成30段,density参数为True表示将直方图进行归一化处理,这样可以将频率转换成概率,使得每个区间的面积和为1。

三、设置直方图属性

1、颜色和透明度

可以使用color参数设置直方图的颜色,使用alpha参数设置透明度。如下代码所示:

# 绘制直方图
plt.hist(data, bins=30, density=True, color='r', alpha=0.5)
plt.title('Histogram with color and transparency')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

2、边框和填充

可以使用edgecolor参数设置边框颜色,使用linewidth参数设置边框线宽,使用fill参数设置是否填充。如下代码所示:

# 绘制直方图
plt.hist(data, bins=30, density=True, edgecolor='k', linewidth=1, fill=True)
plt.title('Histogram with border and fill')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

3、堆叠直方图

可以使用stacked参数将多组数据堆叠在一起,如下代码所示:

# 生成两组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)

# 绘制堆叠直方图
plt.hist([data1, data2], bins=30, density=True, stacked=True)
plt.title('Stacked Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

四、进阶应用

1、直方图密度估计

直方图密度估计是通过将数据分段并在每个区间内拟合一个核密度函数来估计数据的概率密度分布。在matplotlib中,可以使用kde参数进行设置,如下代码所示:

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 绘制直方图密度估计
plt.hist(data, bins=30, density=True, alpha=0.5, color='purple', edgecolor='k', linewidth=1, kde=True)
plt.title('Histogram with density estimation')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

2、直方图分组

有时候数据的范围较大,可以通过将数据分组来减小每个区间内数据的数量,以便更好地展示数据的分布情况。分组的方法可以使用numpy库中的linspace函数生成一个等差数列,如下代码所示:

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 将数据分成两组
groups = np.linspace(min(data), max(data), 3)
group_names = ['Low', 'High']

# 使用cut函数将数据分到指定的组中
category = pd.cut(data, groups, labels=group_names)

# 将数据按照组别进行分组
df = pd.DataFrame({'data': data, 'category': category})
df_grouped = df.groupby('category')

# 绘制直方图
plt.hist([df_grouped.get_group(name)['data'] for name in group_names], bins=30, density=True, alpha=0.5)
plt.title('Histogram with grouping')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

3、子图绘制

有时候需要同时比较多组数据的直方图,可以使用matplotlib中的子图功能进行绘制。具体可以使用subplot函数实现,如下代码所示:

# 生成多组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(4, 1, 1000)

# 绘制子图
fig, axs = plt.subplots(1, 3, figsize=(12, 4))
axs[0].hist(data1, bins=30, density=True, alpha=0.5, color='r')
axs[0].set_title('Histogram 1')
axs[0].set_xlabel('Value')
axs[0].set_ylabel('Frequency')
axs[1].hist(data2, bins=30, density=True, alpha=0.5, color='g')
axs[1].set_title('Histogram 2')
axs[1].set_xlabel('Value')
axs[1].set_ylabel('Frequency')
axs[2].hist(data3, bins=30, density=True, alpha=0.5, color='b')
axs[2].set_title('Histogram 3')
axs[2].set_xlabel('Value')
axs[2].set_ylabel('Frequency')
plt.show()

五、总结

本文从基本概念、绘制基本直方图、设置直方图属性、进阶应用四个方面详细介绍了matplotlib直方图的使用方法,并给出了相应的代码示例。通过学习,我们可以更好地进行数据可视化,并更好地展示数据分布的特点。具体而言,我们可以设置直方图的颜色、边框、柱状图的堆叠方式、直方图密度估计、直方图分组、子图绘制等功能,以更好地展现数据特点。