用Python為直方圖繪製擬合曲線的兩種方法

直方圖是用於展示數據的分組分布狀態的一種圖形,用矩形的寬度和高度表示頻數分布,通過直方圖,用戶可以很直觀的看出數據分布的形狀、中心位置以及數據的離散程度等。

在python中一般採用matplotlib庫的hist來繪製直方圖,至於如何給直方圖添加擬合曲線(密度函數曲線),一般來說有以下兩種方法。

方法一:採用matplotlib中的mlab模塊

mlab模塊是Python中強大的3D作圖工具,立體感效果極佳。在這裡使用mlab可以跳出直方圖二維平面圖形的限制,在此基礎上再添加一條曲線。在這裡,我們以鳶尾花iris中的數據為例,來舉例說明。

import numpy as npnimport matplotlib.mlab as mlabnimport matplotlib.pyplot as pltnimport pandasn# Load datasetnurl =n"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"nnames = [sepal-length, sepal-width,petal-length, petal-width, class]ndataset = pandas.read_csv(url, names=names)nprint(dataset.head(10))n# descriptionsnprint(dataset.describe())nx = dataset.iloc[:,0] #提取第一列的sepal-length變數nmu =np.mean(x) #計算均值nsigma =np.std(x)nmu,sigman

以上為通過python導入鳶尾花iris數據,然後提取第一列的sepal-length變數為研究對象,計算出其均值、標準差,接下來就繪製帶擬合曲線的直方圖。

num_bins = 30 #直方圖柱子的數量nn, bins, patches = plt.hist(x, num_bins,normed=1, facecolor=blue, alpha=0.5) n#直方圖函數,x為x軸的值,normed=1表示為概率密度,即和為一,綠色方塊,色深參數0.5.返回n個概率,直方塊左邊線的x值,及各個方塊對象 ny = mlab.normpdf(bins, mu, sigma)#擬合一條最佳正態分布曲線y nplt.plot(bins, y, r--) #繪製y的曲線nplt.xlabel(sepal-length) #繪製x軸nplt.ylabel(Probability) #繪製y軸nplt.title(rHistogram : $mu=5.8433$,$sigma=0.8253$)#中文標題 uxxx nnplt.subplots_adjust(left=0.15)#左邊距 nplt.show() n

以上命令主要採用mlab.normpdf基於直方圖的柱子數量、均值、方差來擬合曲線,然後再用plot畫出來,這種方法的一個缺點就是畫出的正態分布擬合曲線(紅色虛線)並不一定能很好反映數據的分布情況,如上圖所示。

方法二:採用seaborn庫中的distplot繪製

Seaborn其實是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,在大多數情況下使用seaborn就能做出很具有吸引力的圖,而使用matplotlib就能製作具有更多特色的圖。應該把Seaborn視為matplotlib的補充,而不是替代物。

import seaborn as sns nsns.set_palette("hls") #設置所有圖的顏色,使用hls色彩空間nsns.distplot(x,color="r",bins=30,kde=True)nplt.show()n

在這裡主要使用sns.distplot(增強版dist),柱子數量bins也設置為30,kde=True表示是否顯示擬合曲線,如果為False則只出現直方圖。

在這裡注意一下它與前邊mlab.normpdf方法不同的是,擬合曲線不是正態的,而是更好地擬合了數據的分布情況,如上圖,因此比mlab.normpdf更為準確。

進一步設置sns.distplot,可以採用kde_kws(擬合曲線的設置)、hist_kws(直方柱子的設置),可以得到:nimport seaborn as sns nimport matplotlib as mpl nsns.set_palette("hls") nmpl.rc("figure", figsize=(6,4)) nsns.distplot(x,bins=30,kde_kws={"color":"seagreen", "lw":3 }, hist_kws={ "color": "b" }) nplt.show()n

其中,lw為曲線粗細程度。

寫作不易,特別是技術類的寫作,請大家多多支持,關注、點贊、轉發等等,也歡迎大家關注知乎爬蟲與數據分析專欄:zhuanlan.zhihu.com/zjyi

推薦閱讀:

為什麼可以像執行系統命令一樣執行 Python 的包,如 scrapy crawl xxx?
Python爬蟲簡易代理池
python的descriptor的意圖是什麼,想知道python當初弄出功能的意圖?困擾我好久了。
通俗 Python 設計模式——享元模式

TAG:Python | 数据可视化 |