Python畫圖教學:數據分析可視化直方圖

直方圖和柱狀圖都是數據分析中非常常見、常用的圖表,由於兩者外觀上看起來非常相似,也就難免造成一些混淆。

01 概述

直方圖(Histogram),形狀類似柱狀圖卻有著與柱狀圖完全不同的含義。直方圖牽涉統計學概念,首先要對數據進行分組,然後統計每個分組內數據元的數量。在平面直角座標系中,橫軸標出每個組的端點,縱軸表示頻數,每個矩形的高代表對應的頻數,這樣的統計圖稱為頻數分佈直方圖。

頻數分佈直方圖需要經過頻數乘以組距的計算過程才能得出每個分組的數量,同一個直方圖的組距是一個固定不變的值,所以如果直接用縱軸表示數量,每個矩形的高代表對應的數據元數量,既能保持分佈狀態不變,又能直觀地看出每個分組的數量。

如圖2-58所示。

Python畫圖教學:數據分析可視化直方圖

圖2-58 直方圖

通過直方圖還可以觀察和估計哪些數據比較集中,異常或者孤立的數據分佈在何處。

首先,瞭解如下幾個基本概念。

  • 組數:在統計數據時,我們把數據按照不同的範圍分成幾個組,分成的組的個數稱為組數。
  • 組距:每一組兩個端點的差。
  • 頻數:分組內數據元的數量除以組距。

02 實例

直方圖代碼示例如下所示。

  • 代碼示例 2-45

1plot = figure(plot_width=300, plot_height=300) 2plot.quad(top=[2, 3, 4], bottom=[1, 2, 3], left=[1, 2, 3], 3 right=[1.2, 2.5, 3.7], color=''#B3DE69'') 4show(plot)

運行結果如圖2-59所示。

Python畫圖教學:數據分析可視化直方圖

圖2-59 代碼示例2-45運行結果

代碼示例2-45第2行使用quad ()方法通過定義矩形的四邊邊界繪製直方圖,具體參數說明如下。

p .quad(left, right, top, bottom, **kwargs)參數說明。

  • left(:class:`~bokeh.core.properties.NumberSpec` ) : 直方x軸左側邊界
  • right (:class:`~bokeh.core.properties.NumberSpec` ) : 直方x軸右側邊界
  • top (:class:`~bokeh.core.properties.NumberSpec` ) : 直方y軸頂部邊界
  • bottom (:class:`~bokeh.core.properties.NumberSpec` ) : 直方y軸底部邊界

其他參數(**kwargs)說明。

  • alpha(float) : 一次性設置所有線條的透明度
  • color(Color) : 一次性設置所有線條的顏色
  • source(ColumnDataSource) : Bokeh特有數據格式(類似於Pandas Dataframe)
  • legend(str) : 圖元的圖例
  • x_range_name(str) : x軸範圍名稱
  • y_range_name(str) : y軸範圍名稱
  • level (Enum) : 圖元渲染級別
  • 代碼示例 2-46

1import numpy as np 2import scipy.special 3from bokeh.layouts import gridplot 4# 繪圖函數 5def make_plot(title, hist, edges, x, pdf, cdf): 6 p = figure(title=title, tools='', background_fill_color=''#fafafa'') 7 p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:], 8 fill_color=''navy'', line_color=''white'', alpha=0.5) 9 p.line(x, pdf, line_color=''#ff8888'', line_width=4, alpha=0.7, legend=''PDF'') 10 p.line(x, cdf, line_color=''orange'', line_width=2, alpha=0.7, legend=''CDF'') 11 12 p.y_range.start = 0 13 p.legend.location = ''center_right'' 14 p.legend.background_fill_color = ''#fefefe'' 15 p.xaxis.axis_label = 'x' 16 p.yaxis.axis_label = 'Pr(x)' 17 p.grid.grid_line_color=''white'' 18 return p 19# 正態分佈 20mu, sigma = 0, 0.5 21measured = np.random.normal(mu, sigma, 1000) 22hist, edges = np.histogram(measured, density=True, bins=50) 23x = np.linspace(-2, 2, 1000) 24# 擬合曲線 25pdf = 1/(sigma * np.sqrt(2*np.pi)) * np.exp(-(x-mu)**2 / (2*sigma**2)) 26cdf = (1+scipy.special.erf((x-mu)/np.sqrt(2*sigma**2)))/2 27p1 = make_plot(''Normal Distribution (μ=0, σ=0.5)'', hist, edges, x, pdf, cdf) 28# 對數正態分佈 29mu, sigma = 0, 0.5 30measured = np.random.lognormal(mu, sigma, 1000) 31hist, edges = np.histogram(measured, density=True, bins=50) 32x = np.linspace(0.0001, 8.0, 1000) 33pdf = 1/(x* sigma * np.sqrt(2*np.pi)) * np.exp(-(np.log(x)-mu)**2 / (2*sigma**2)) 34cdf = (1+scipy.special.erf((np.log(x)-mu)/(np.sqrt(2)*sigma)))/2 35p2 = make_plot(''Log Normal Distribution (μ=0, σ=0.5)'', hist, edges, x, pdf, cdf) 36# 伽瑪分佈 37k, theta = 7.5, 1.0 38measured = np.random.gamma(k, theta, 1000) 39hist, edges = np.histogram(measured, density=True, bins=50) 40x = np.linspace(0.0001, 20.0, 1000) 41pdf = x**(k-1) * np.exp(-x/theta) / (theta**k * scipy.special.gamma(k)) 42cdf = scipy.special.gammainc(k, x/theta) 43p3 = make_plot(''Gamma Distribution (k=7.5, θ=1)'', hist, edges, x, pdf, cdf) 44# 韋伯分佈 45lam, k = 1, 1.25 46measured = lam*(-np.log(np.random.uniform(0, 1, 1000)))**(1/k) 47hist, edges = np.histogram(measured, density=True, bins=50) 48x = np.linspace(0.0001, 8, 1000) 49pdf = (k/lam)*(x/lam)**(k-1) * np.exp(-(x/lam)**k) 50cdf = 1 - np.exp(-(x/lam)**k) 51p4 = make_plot(''Weibull Distribution (λ=1, k=1.25)'', hist, edges, x, pdf, cdf) 52# 顯示 53show(gridplot([p1,p2,p3,p4], ncols=2, plot_width=400, plot_height=400, toolbar_location=None))

運行結果如圖所示。

Python畫圖教學:數據分析可視化直方圖

代碼示例2-46運行結果


代碼示例2-46第5行自定義繪圖函數make_plot (title, hist, edges, x, pdf, cdf),其中參數分別為圖的標題、直方頂部邊界、左右邊界、擬合曲線的x座標、方法通過定義矩形的四邊邊界,PDF為概率密度函數,CDF為累積分佈函數。第53行通過gridplot()方法一次展示4張圖(正態分佈、對數正態分佈、伽瑪分佈、韋伯分佈)。

延伸閱讀《Python數據可視化》

Python畫圖教學:數據分析可視化直方圖

《Python數據可視化》

推薦理由:從圖形繪製、數據動態展示、Web交互等維度全面講解Bokeh功能和使用,不含複雜數據處理和算法,深入淺出,適合零基礎入門,包含大量案例。

最後,小編想說:我是一名python開發工程師,

整理了一套最新的python系統學習教程,

想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助


分享到:


相關文章: