本文目录导读:

我来为您介绍几种Python绘制直方图的常用方法。
使用Matplotlib绘制直方图
基础直方图
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(42)
data = np.random.randn(1000) # 1000个正态分布数据
# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, alpha=0.7, color='skyblue', edgecolor='black')'数据分布直方图')
plt.xlabel('数值')
plt.ylabel('频数')
plt.grid(True, alpha=0.3)
plt.show()
多组数据对比
# 生成两组数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1.5, 1000)
plt.figure(figsize=(10, 6))
plt.hist(data1, bins=30, alpha=0.5, label='组1', color='blue')
plt.hist(data2, bins=30, alpha=0.5, label='组2', color='red')'两组数据分布对比')
plt.xlabel('数值')
plt.ylabel('频数')
plt.legend()
plt.show()
使用Seaborn绘制高级直方图
import seaborn as sns
import pandas as pd
# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
'value': np.random.randn(1000),
'category': np.random.choice(['A', 'B', 'C'], 1000)
})
# 基本分布图
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='value', bins=30, kde=True)'Seaborn分布图(含密度曲线)')
plt.show()
# 按类别分组
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='value', hue='category', bins=30,
alpha=0.6, multiple='stack')'按类别分组的分布图')
plt.show()
实用的高级案例
带统计信息的直方图
from scipy import stats
# 生成数据
data = np.random.exponential(scale=2, size=1000)
plt.figure(figsize=(12, 7))
# 绘制直方图
n, bins, patches = plt.hist(data, bins=30, density=True,
alpha=0.7, color='lightgreen',
edgecolor='black')
# 拟合分布曲线
params = stats.expon.fit(data)
x = np.linspace(0, max(data), 100)
pdf = stats.expon.pdf(x, *params)
plt.plot(x, pdf, 'r-', lw=2, label='指数分布拟合')
'数据分布与拟合曲线')
plt.xlabel('数值')
plt.ylabel('概率密度')
plt.legend()
# 添加统计信息
stats_text = f'均值: {np.mean(data):.2f}\n中位数: {np.median(data):.2f}\n标准差: {np.std(data):.2f}'
plt.text(0.7, 0.7, stats_text, transform=plt.gca().transAxes,
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
plt.show()
自定义美化直方图
plt.figure(figsize=(12, 7))
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
data = np.random.beta(a=2, b=5, size=1000)
# 自定义颜色和样式
n, bins, patches = plt.hist(data, bins=25, density=True,
cumulative=False, alpha=0.75,
color='#2196F3', edgecolor='white', linewidth=1.2)
# 添加渐变颜色
for i, patch in enumerate(patches):
patch.set_facecolor(plt.cm.viridis(i/len(patches)))
'🎯 数据分布可视化', fontsize=16, fontweight='bold')
plt.xlabel('数值区间', fontsize=12)
plt.ylabel('概率密度', fontsize=12)
plt.grid(True, alpha=0.3)
# 添加均值线
mean_val = np.mean(data)
plt.axvline(mean_val, color='red', linestyle='--', linewidth=2,
label=f'均值: {mean_val:.3f}')
plt.legend()
plt.tight_layout()
plt.show()
3D直方图效果
from mpl_toolkits.mplot3d import Axes3D
# 3D效果
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# 生成数据
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)
# 创建2D直方图
hist, xedges, yedges = np.histogram2d(x, y, bins=20)
# 构建网格
xpos, ypos = np.meshgrid(xedges[:-1], yedges[:-1])
xpos = xpos.flatten()
ypos = ypos.flatten()
zpos = np.zeros_like(xpos)
dx = dy = 0.5 * np.ones_like(zpos)
dz = hist.flatten()
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, shade=True, alpha=0.7)
ax.set_title('3D直方图', fontsize=14)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('频数')
plt.show()
- bins参数:控制直方图的柱子数量,bins越多细节越多
- alpha参数:控制透明度,适合重叠显示
- density参数:归一化显示概率密度
- cumulative参数:显示累积分布
- kde参数:添加核密度估计曲线
- edgecolor:添加边框使柱状图更清晰
选择哪种方法取决于您的具体需求:
- 快速查看:使用
plt.hist()基础功能 - 美观展示:使用
seaborn.histplot() - 详细分析:搭配统计信息和拟合曲线