作者:劉順祥
個人微信公眾號:每天進步一點點2015
前文傳送門:
從零開始學Python數據分析【1】--數據類型及結構
從零開始學Python數據分析【2】-- 數值計算及正則表達式
從零開始學Python數據分析【3】-- 控制流與自定義函數
從零開始學Python數據分析【4】-- numpy
從零開始學Python數據分析【5】-- pandas(序列部分)
從零開始學Python數據分析【6】-- pandas(數據框部分01)
從零開始學Python數據分析【7】-- pandas(數據框部分02)
從零開始學Python數據分析【8】-- pandas(數據框部分03)
從零開始學Python數據分析【9】-- pandas(數據框部分04)
從零開始學Python數據分析【10】-- matplotlib(條形圖)
從零開始學Python數據分析【11】-- matplotlib(餅圖)
從零開始學Python數據分析【12】-- matplotlib(箱線圖)
前言在上一期的Python繪圖系列中,我們仔細的講解了如何繪製數值型變量的箱線圖,展現數據的分布,我們還可以使用直方圖來說明,同過圖形的長相,就可以快速的判斷數據是否近似服從正態分布。之所以我們很關心數據的分布,是因為在統計學中,很多假設條件都會包括正態分布,故使用直方圖來定性的判定數據的分布情況,尤其顯得重要。這期我們就來介紹Python中如何繪製一個直方圖。
hist函數的參數解讀繪圖之前,我們先來講解一下matplotlib包中hist函數的參數含義及使用方法:
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)
x:指定要繪製直方圖的數據;
bins:指定直方圖條形的個數;
range:指定直方圖數據的上下界,默認包含繪圖數據的最大值和最小值;
normed:是否將直方圖的頻數轉換成頻率;
weights:該參數可為每一個數據點設置權重;
cumulative:是否需要計算累計頻數或頻率;
bottom:可以為直方圖的每個條形添加基準線,默認為0;
histtype:指定直方圖的類型,默認為bar,除此還有』barstacked』, 『step』, 『stepfilled』;
align:設置條形邊界值的對其方式,默認為mid,除此還有』left』和』right』;
orientation:設置直方圖的擺放方向,默認為垂直方向;
rwidth:設置直方圖條形寬度的百分比;
log:是否需要對繪圖數據進行log變換;
color:設置直方圖的填充色;
label:設置直方圖的標籤,可通過legend展示其圖例;
stacked:當有多個數據時,是否需要將直方圖呈堆疊擺放,默認水平擺放;
一元直方圖的繪製案例:titanic數據集
# 導入第三方包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
# 中文和負號的正常顯示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = False
# 讀取Titanic數據集
titanic = pd.read_csv('titanic_train.csv')
# 檢查年齡是否有缺失any(titanic.Age.isnull())
# 不妨刪除含有缺失年齡的觀察
titanic.dropna(subset=['Age'], inplace=True)
# 設置圖形的顯示風格
plt.style.use('ggplot')
# 繪圖:乘客年齡的頻數直方圖
plt.hist(titanic.Age, # 繪圖數據 bins = 20, # 指定直方圖的條形數為20個 color = 'steelblue', # 指定填充色 edgecolor = 'k', # 指定直方圖的邊界色 label = '直方圖' )# 為直方圖呈現標籤
# 去除圖形頂部邊界和右邊界的刻度
plt.tick_params(top='off', right='off')
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()
上圖繪製的是年齡的頻數直方圖,從整體的分布來看,有點像正態分布,兩邊低中間高的倒鐘形狀。除此,我們還可以繪製累計頻率直方圖,並且設置5歲為組距,如下代碼可以表示成:
# 繪圖:乘客年齡的累計頻率直方圖
plt.hist(titanic.Age, # 繪圖數據 bins = np.arange(titanic.Age.min(),titanic.Age.max(),5), # 指定直方圖的組距 normed = True, # 設置為頻率直方圖 cumulative = True, # 積累直方圖 color = 'steelblue', # 指定填充色 edgecolor = 'k', # 指定直方圖的邊界色 label = '直方圖' )# 為直方圖呈現標籤
# 設置坐標軸標籤和標題
plt.title('乘客年齡的頻率累計直方圖')plt.xlabel('年齡')plt.ylabel('累計頻率')
# 去除圖形頂部邊界和右邊界的刻度
plt.tick_params(top='off', right='off')
# 顯示圖例
plt.legend(loc = 'best')
# 顯示圖形
plt.show()
通過累計頻率直方圖就可以快速的發現什麼年齡段的人數佔了多少比重,例如35歲以下的乘客佔了7成,這種圖的解讀有點像帕累託圖。為了測試數據集是否近似服從正態分布,需要在直方圖的基礎上再繪製兩條線,一條表示理論的正態分布曲線,另一條為核密度曲線,目的就是比較兩條曲線的吻合度,越吻合就說明數據越近似於正態分布。接下來我們就在直方圖的基礎上再添加兩條曲線:
# 正太分布圖
plt.hist(titanic.Age, # 繪圖數據 bins = np.arange(titanic.Age.min(),titanic.Age.max(),5), # 指定直方圖的組距 normed = True, # 設置為頻率直方圖 color = 'steelblue', # 指定填充色 edgecolor = 'k') # 指定直方圖的邊界色
# 設置坐標軸標籤和標題
plt.title('乘客年齡直方圖')plt.xlabel('年齡')plt.ylabel('頻率')
# 生成正態曲線的數據
x1 = np.linspace(titanic.Age.min(), titanic.Age.max(), 1000)normal = mlab.normpdf(x1, titanic.Age.mean(), titanic.Age.std())
# 繪製正態分布曲線
line1, = plt.plot(x1,normal,'r-', linewidth = 2) # 生成核密度曲線的數據
kde = mlab.GaussianKDE(titanic.Age)x2 = np.linspace(titanic.Age.min(), titanic.Age.max(), 1000)
# 繪製
line2, = plt.plot(x2,kde(x2),'g-', linewidth = 2)
# 去除圖形頂部邊界和右邊界的刻度
plt.tick_params(top='off', right='off')
# 顯示圖例
plt.legend([line1, line2],['正態分布曲線','核密度曲線'],loc='best')
# 顯示圖形
plt.show()
從直方圖的展現來看,乘客的年齡分布與理論正態分布曲線存在一些差異,說明不服從正態分布,而且從圖中也能看見,年齡呈現右偏的特徵。
上面繪製的直方圖都是基於所有乘客的年齡,如果想對比男女乘客的年齡直方圖的話,我們可以通過兩個hist將不同性別的直方圖繪製到一張圖內,具體代碼如下:
# 提取不同性別的年齡數據
age_female = titanic.Age[titanic.Sex == 'female']age_male = titanic.Age[titanic.Sex == 'male']
# 設置直方圖的組距
bins = np.arange(titanic.Age.min(), titanic.Age.max(), 2)
# 男性乘客年齡直方圖
plt.hist(age_male, bins = bins, label = '男性', color = 'steelblue', alpha = 0.7)
# 女性乘客年齡直方圖plt.hist(age_female, bins = bins, label = '女性', alpha = 0.6)
# 設置坐標軸標籤和標題
plt.title('乘客年齡直方圖')plt.xlabel('年齡')plt.ylabel('人數')
# 去除圖形頂部邊界和右邊界的刻度
plt.tick_params(top='off', right='off')
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()
圖中結果反映了,不同年齡組內幾乎都是男性乘客比女性乘客要多;同時,也說明男女性別的年齡組分布幾乎一致。
OK,今天關於Pyhton繪製直方圖的講解就到此結束,如果你感興趣,不妨和我一起學習與交流,同時也歡迎各位朋友繼續轉發與分享,讓系統的知識不斷的擴散出去。下一期我們將推送折線圖的繪製。文中相關的Python腳本和PDF版本已存放到百度雲盤,可以通過下面的連結獲取:
連結: https://pan.baidu.com/s/1qYwSXWS 密碼: agcf
Python愛好者社區歷史文章大合集:
Python愛好者社區歷史文章列表(每周append更新一次)
福利:文末掃碼立刻關注公眾號,「Python愛好者社區」,開始學習Python課程:
關注後在公眾號內回復「課程」即可獲取:
0.小編的Python入門視頻課程!!!
1.崔老師爬蟲實戰案例免費學習視頻。
2.丘老師數據科學入門指導免費學習視頻。
3.陳老師數據分析報告製作免費學習視頻。
4.玩轉大數據分析!Spark2.X+Python 精華實戰課程免費學習視頻。
5.丘老師Python網絡爬蟲實戰免費學習視頻。