详解用Python为直方图绘制拟合曲线的两种方法

许南星
许南星
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍在Python中为直方图添加拟合曲线的两种常用方法。首先通过matplotlib的mlab模块结合正态分布函数进行拟合,但需注意其局限性;其次推荐采用seaborn库的distplot函数,通过设置kde参数实现更贴合数据分布的核密度估计曲线,并支持自定义线条与柱状图样式。

直方图与拟合曲线概述

直方图是一种用于展示数据分组分布状态的图形工具,它利用矩形的宽度和高度来反映频数分布情况。通过观察直方图,用户可以直观地掌握数据的分布形态、中心趋势以及离散程度等关键特征。

在Python环境中,通常使用matplotlib库中的hist函数来绘制直方图。若需进一步为直方图添加拟合曲线(即密度函数曲线),主要存在两种实现路径。

方法一:使用matplotlib mlab模块

第一种方法:利用matplotlib中的mlab模块。

mlab模块是Python中功能强大的3D绘图工具,能够提供出色的立体视觉效果。在此场景下,使用mlab可以突破直方图二维平面图形的限制,并在其基础上叠加一条拟合曲线。以下以鸢尾花(iris)数据集为例进行说明。


import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import pandas
# Load dataset
url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width','petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
print(dataset.head(10))
# descriptions
print(dataset.describe())
x = dataset.iloc[:,0] #提取第一列的sepal-length变量
mu =np.mean(x) #计算均值
sigma =np.std(x)
mu,sigma

上述代码演示了如何从Python中导入鸢尾花iris数据,提取第一列sepal-length变量作为研究对象,计算其均值与标准差,随后绘制带有拟合曲线的直方图。


num_bins = 30 #直方图柱子的数量

n, bins, patches = plt.hist(x, num_bins,normed=1, facecolor='blue', alpha=0.5)
#直方图函数,x为x轴的值,normed=1表示为概率密度,即和为一,绿色方块,色深参数0.5.返回n个概率,直方块左边线的x值,及各个方块对象
y = mlab.normpdf(bins, mu, sigma)#拟合一条最佳正态分布曲线y 
plt.plot(bins, y, 'r--') #绘制y的曲线
plt.xlabel('sepal-length') #绘制x轴
plt.ylabel('Probability') #绘制y轴
plt.title(r'Histogram : $\mu=5.8433$,$\sigma=0.8253$')#中文标题 u'xxx' 

plt.subplots_adjust(left=0.15)#左边距 
plt.show() 


上述命令主要利用mlab.normpdf,基于直方图的柱子数量、均值和方差来生成拟合曲线,并通过plot函数将其绘制出来。这种方法的一个潜在缺点是,所绘制的正态分布拟合曲线(图中红色虚线)未必能准确反映数据的实际分布情况,如图所示。

方法二:使用seaborn distplot

第二种方法:使用seaborn库中的distplot函数进行绘制。

Seaborn是在matplotlib基础上构建的高级API封装,旨在简化绘图过程。在大多数情况下,使用seaborn即可生成极具吸引力的图表,而matplotlib则适用于需要更多定制化特色的场景。建议将Seaborn视为matplotlib的补充而非替代品。


import seaborn as sns 
sns.set_palette("hls") #设置所有图的颜色,使用hls色彩空间
sns.distplot(x,color="r",bins=30,kde=True)
plt.show()


此处主要调用sns.distplot(增强版分布图),将柱子数量bins设置为30。参数kde=True表示是否显示拟合曲线,若设为False则仅显示直方图。

需要注意的是,与前文mlab.normpdf方法不同,此处的拟合曲线并非强制正态分布,而是更好地拟合了数据的实际分布情况,如上图所示,因此相比mlab.normpdf更为准确。

进一步配置sns.distplot时,可以通过kde_kws(拟合曲线设置)和hist_kws(直方柱子设置)进行精细调整,从而得到:


import seaborn as sns 
import matplotlib as mpl 
sns.set_palette("hls") 
mpl.rc("figure", figsize=(6,4)) 
sns.distplot(x,bins=30,kde_kws={"color":"seagreen", "lw":3 }, hist_kws={ "color": "b" }) 
plt.show()


其中,lw参数用于控制曲线的粗细程度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表