什麼是直方圖?跟柱狀圖有什麼區別?終於有人講明白了
2021-12-29由 華章科技 發表于 林業
橫軸是什麼意思啊
導讀:直方圖和柱狀圖都是資料分析中非常常見、常用的圖表,由於兩者外觀上看起來非常相似,也就難免造成一些混淆。此前我們曾在《柱狀圖、堆疊柱狀圖、瀑布圖有什麼區別?怎樣用Python繪製?》一文中帶大家瞭解了柱狀圖,今天我們再來講講直方圖。
相關連結:柱狀圖、堆疊柱狀圖、瀑布圖……有什麼區別?怎樣用Python繪製?
作者:屈希峰,資深Python工程師,知乎多個專欄作者
01 概述
直方圖(Histogram),形狀類似柱狀圖卻有著與柱狀圖完全不同的含義。直方圖牽涉統計學概念,
首先要對資料進行分組,然後統計每個分組內資料元的數量。
在平面直角座標系中,橫軸標出每個組的端點,縱軸表示頻數,每個矩形的高代表對應的頻數,這樣的統計圖稱為頻數分佈直方圖。
頻數分佈直方圖需要經過頻數乘以組距的計算過程才能得出每個分組的數量,同一個直方圖的組距是一個固定不變的值,所以如果直接用縱軸表示數量,每個矩形的高代表對應的資料元數量,既能保持分佈狀態不變,又能直觀地看出每個分組的數量,如圖2-58所示。
▲圖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所示。
▲圖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”)1112 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))
執行結果如圖2-60所示。
▲圖2-60 程式碼示例2-46執行結果
程式碼示例2-46第5行自定義繪圖函式make_plot (title, hist, edges, x, pdf, cdf),其中引數分別為圖的標題、直方頂部邊界、左右邊界、擬合曲線的x座標、方法透過定義矩形的四邊邊界,PDF為機率密度函式,CDF為累積分佈函式。第53行透過gridplot()方法一次展示4張圖(正態分佈、對數正態分佈、伽瑪分佈、韋伯分佈)。
本文摘編自《Python資料視覺化:基於Bokeh的視覺化繪圖》,經出版方授權釋出。
延伸閱讀《Python資料視覺化》
推薦語:
從圖形繪製、資料動態展示、Web互動等維度全面講解Bokeh功能和使用,不含複雜資料處理和演算法,深入淺出,適合零基礎入門,包含大量案例。