我们将主要介绍三种方法,从最基础的到最专业的:
- 使用
matplotlib.pyplot:最基础、最通用的绘图库。 - 使用
pandas.DataFrame:当你处理结构化数据(如 DataFrame)时,非常方便。 - 使用
seaborn:基于 matplotlib,提供了更美观、更高级的统计图形接口。
使用 matplotlib.pyplot
matplotlib 是 Python 数据可视化的基石。pyplot 模块提供了一个类似 MATLAB 的接口,非常适合快速绘图。
基本用法
你需要导入 matplotlib.pyplot 和 numpy(用于生成示例数据)。
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
# 生成一个包含1000个随机数的正态分布数据集
data = np.random.randn(1000)
# 2. 创建直方图
# plt.hist() 是核心函数
plt.hist(data)
# 3. 添加标题和标签"Simple Histogram")
plt.xlabel("Value")
plt.ylabel("Frequency")
# 4. 显示图形
plt.show()
代码解释:
np.random.randn(1000):生成1000个符合标准正态分布(均值为0,标准差为1)的随机数。plt.hist(data):这是最简单的用法,matplotlib会自动选择数据的区间(bins)和颜色。plt.title(),plt.xlabel(),plt.ylabel():为图形添加标题和坐标轴标签,这是让图表可读的关键。plt.show():在屏幕上显示图形。
plt.hist() 的关键参数
plt.hist() 函数非常灵活,可以通过调整参数来定制你的直方图。
| 参数 | 描述 | 示例 |
|---|---|---|
bins |
指定区间的数量或区间的边界,这是最重要的参数之一。 | bins=30 (分成30个区间)bins=[-3, -2, -1, 0, 1, 2, 3] (指定边界) |
range |
指定数据的范围,只统计这个范围内的数据。 | range=(-2, 2) (只统计-2到2之间的数据) |
density |
如果为 True,则直方图的面积总和为1,得到的是概率密度分布,如果为 False(默认),则得到的是频次。 |
density=True |
color |
设置条形的颜色。 | color='green' |
alpha |
设置条形的透明度(0到1之间)。 | alpha=0.7 (70%不透明) |
edgecolor |
设置条形边缘的颜色。 | edgecolor='black' |
weights |
为每个数据点指定权重。 | weights=np.ones_like(data) * 5 (每个数据点权重为5) |
进阶示例
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
data = np.random.randn(1000)
# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(10, 6))
# 绘制自定义直方图
ax.hist(data,
bins=30, # 分成30个区间
range=(-4, 4), # 只显示-4到4的数据
density=True, # 显示概率密度
color='skyblue', # 条形颜色
alpha=0.8, # 透明度
edgecolor='black' # 边缘颜色
)
# 添加网格线
ax.grid(True, linestyle='--', alpha=0.6)
和标签
ax.set_title("Advanced Histogram with Matplotlib")
ax.set_xlabel("Value")
ax.set_ylabel("Probability Density")
# 显示图形
plt.show()
使用 pandas.DataFrame
当你有一个 pandas DataFrame 时,直接使用其 .hist() 方法会非常方便,因为它可以直接针对某一列进行绘图,并且自动整合了 matplotlib 的功能。
基本用法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1. 准备数据
# 创建一个包含随机数据的DataFrame
data = {
'values': np.random.randn(1000),
'category': np.random.choice(['A', 'B', 'C'], 1000)
}
df = pd.DataFrame(data)
# 2. 使用 DataFrame 的 hist() 方法
# 默认会为每一列生成一个直方图
df.hist()
plt.show()
代码解释:
df.hist():pandas会为 DataFrame 中所有数值类型的列分别绘制直方图。
针对 DataFrame 的某一列绘图
这更常见。
# 针对 'values' 这一列绘制直方图
df['values'].hist(bins=25, grid=False, color='purple', figsize=(8, 5))
"Histogram of a DataFrame Column")
plt.xlabel("Value")
plt.ylabel("Count")
plt.show()
pandas.DataFrame.hist() 的特点
- 便捷性:无需手动调用
plt函数来设置标签和标题(虽然你仍然可以)。 - 多图布局:如果你选择绘制多列,它会自动将它们排列在一个网格中。
- 参数:它接受大部分
matplotlib.pyplot.hist()的参数,如bins,color,alpha等。
使用 seaborn
seaborn 是一个基于 matplotlib 的高级可视化库,它专注于统计图表,默认情况下比 matplotlib 的图形更美观,并且能更好地处理数据集。
基本用法
seaborn 的核心函数是 sns.histplot()。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
data = np.random.randn(1000)
# 2. 使用 seaborn 绘制直方图
sns.histplot(data)
# 3. 添加标题和标签 (仍然使用 matplotlib)"Simple Histogram with Seaborn")
plt.xlabel("Value")
plt.ylabel("Count")
# 4. 显示图形
plt.show()
代码解释:
sns.histplot(data):seaborn会自动选择漂亮的颜色和样式,并默认添加一个核密度估计曲线。
sns.histplot() 的强大功能
seaborn 的直方图功能非常强大,尤其是在处理分类变量时。
| 参数 | 描述 | 示例 |
|---|---|---|
kde |
是否绘制核密度估计曲线。kde=True (默认) |
kde=True |
stat |
计算什么作为高度,可选 'count' (频次), 'frequency' (频率), 'density' (密度), 'probability' (概率)。 |
stat='density' |
bins |
与 matplotlib 类似,控制区间数量。 |
bins=20 |
hue |
(最强大的功能之一) 根据某个分类变量为不同组的数据绘制不同的直方图,并自动用不同颜色区分。 | hue='category' |
高级示例:按类别分组绘制
这是 seaborn 的一个杀手级功能。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1. 准备数据
# 创建一个带有分类标签的DataFrame
data = {
'values': np.concatenate([np.random.randn(500), np.random.randn(500) + 1.5]),
'category': ['A'] * 500 + ['B'] * 500
}
df = pd.DataFrame(data)
# 2. 使用 hue 参数进行分组
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='values', hue='category', bins=30, kde=True, alpha=0.6)
# 3. 添加标题和标签"Grouped Histogram by Category with Seaborn")
plt.xlabel("Value")
plt.ylabel("Count")
# 4. 显示图形
plt.show()
代码解释:
data=df:告诉seaborn从 DataFrame 中读取数据。x='values':指定 x 轴使用values列。hue='category':这是关键!seaborn会根据category列中的值('A' 和 'B')将数据分成两组,并为每组绘制一个直方图,用不同颜色表示,还会自动添加图例。
总结与对比
| 特性 | matplotlib.pyplot.hist() |
pandas.DataFrame.hist() |
seaborn.histplot() |
|---|---|---|---|
| 易用性 | 基础,需要手动设置很多细节 | 非常方便,适合快速查看数据列 | 非常方便,语法直观 |
| 美观度 | 默认较朴素,需要手动美化 | 比 matplotlib 好一点 |
非常美观,默认样式专业 |
| 核心优势 | 最底层、最灵活,可定制性极强 | 与 pandas 数据结构无缝集成,适合快速探索性分析 |
统计图形专家,hue 分组功能强大,自动支持 KDE 曲线 |
| 适用场景 | 需要高度定制化的图形,或作为其他绘图库的基础 | 快速绘制 DataFrame 中单列或多列的直方图 | 绘制美观、信息丰富的统计图形,特别是需要按类别分组时 |
如何选择?
- 如果你只是想快速看一下某一列数据的分布:使用
df['column'].hist()是最快的选择。 - 如果你需要创建一个完全自定义、符合出版标准的图形:使用
matplotlib.pyplot.hist(),因为它提供了最精细的控制。 - 如果你想要一个美观、专业的图形,并且需要根据分类变量进行比较:强烈推荐使用
seaborn.histplot(),它的hue功能会让你的工作事半功倍。
希望这个详细的解释能帮助你掌握 Python 中直方图的用法!
