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

作者:博观厚积 时间:2021-06-15 23:58:08 

直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状、中心位置以及数据的离散程度等。

在python中一般采用matplotlib库的hist来绘制直方图,至于如何给直方图添加拟合曲线(密度函数曲线),一般来说有以下两种方法。

方法一:采用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()

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

以上命令主要采用mlab.normpdf基于直方图的柱子数量、均值、方差来拟合曲线,然后再用plot画出来,这种方法的一个缺点就是画出的正态分布拟合曲线(红色虚线)并不一定能很好反映数据的分布情况,如上图所示。

方法二:采用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()

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

在这里主要使用sns.distplot(增强版dist),柱子数量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()

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

其中,lw为曲线粗细程度。

来源:https://www.jianshu.com/p/65395b00adbc

标签:Python,直方图,拟合曲线
0
投稿

猜你喜欢

  • asp中isNull(str), isEmpty(str)和str=""的区别

    2008-02-15 13:10:00
  • VMware中Linux共享mysql数据库

    2010-10-25 20:29:00
  • Python中的TCP socket写法示例

    2023-06-25 00:21:05
  • PHP的SQL注入过程分析

    2023-11-18 02:53:27
  • 详解Go语言微服务开发框架之Go chassis

    2023-06-19 03:39:36
  • 查看Oracle的执行计划一句话命令

    2010-07-16 13:02:00
  • python分布式编程实现过程解析

    2023-11-10 21:13:48
  • 用 iframe 解决下拉框与层之冲突

    2008-04-28 12:24:00
  • Python 读取千万级数据自动写入 MySQL 数据库

    2023-11-08 09:25:47
  • php使用curl获取https请求的方法

    2023-11-17 11:46:49
  • Python实现滑雪小游戏

    2023-08-10 15:30:03
  • PHP封装CURL扩展类实例

    2023-07-17 15:19:50
  • 提高MySQL查询效率的三个技巧

    2009-02-11 13:19:00
  • 使用Dreamweaver代码片断提高css开发效率

    2007-10-28 15:46:00
  • PHP实现PDF转图片的方法详解

    2023-05-26 19:59:51
  • 如何了解SQL的执行频率

    2009-08-26 15:17:00
  • sp_delete_backuphistory

    2008-06-07 13:59:00
  • asp fckeditor自定义上传文件的文件名

    2011-03-30 11:03:00
  • JavaScript缓动库

    2009-05-25 12:50:00
  • python机器学习之神经网络

    2023-11-10 21:39:19
  • asp之家 网络编程 m.aspxhome.com