详解用Python为直方图绘制拟合曲线的两种方法
本文介绍在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参数用于控制曲线的粗细程度。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













