從零開始學Python數據分析【13】-- matplotlib(直方圖)

2021-03-02 Python愛好者社區

作者:劉順祥

個人微信公眾號:每天進步一點點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網絡爬蟲實戰免費學習視頻。

相關焦點

  • 從零開始學Python【18】--matplotlib(熱力圖)
    往期回顧從零開始學Python【17】--matplotlib(面積圖)從零開始學
  • 從零開始學Python【12】--matplotlib(箱線圖)
    ,例如箱線圖、直方圖、折線圖、面積圖、散點圖等等。下一期我們將推送直方圖的繪製。>從零開始學Python【11】--matplotlib(餅圖)從零開始學Python【10】--matplotlib(條形圖)Python自定義函數的參數解讀從零開始學Python【9】--pandas(數據框部分04)從零開始學Python【8】--pandas(數據框部分
  • 從零開始學Python【14】--matplotlib(折線圖)
    往期matplotlib繪圖系列從零開始學Python【13】--matplotlib(直方圖
  • 從零開始學Python【10】--matplotlib(條形圖)
    前言       之前在公眾號裡推送了《從零開始學Python》的系列,主要分享了關於Python
  • Python 數據可視化matplotlib
    很多python數據可視化看起來都比正常的數據分析更加立體,如何做出這種數據分析的,或者說是python數據可視化呢?
  • 十分鐘上手matplotlib,開啟你的python可視化
    -matplotlib是一個python 2D繪圖庫,利用它可以畫出許多高質量的圖像。只需幾行代碼即可生成直方圖,條形圖,餅圖,散點圖等。Matplotlib可用於Python腳本,Python和IPython shell,Jupyter筆記本,Web應用程式伺服器和四個圖形用戶界面工具包。
  • 【數據分析】Matplotlib
    Matplotlib是一個強大的Python繪圖和數據可視化的工具包。數據可視化也是我們數據分析的最重要的工作之一,可以幫助我們完成很多操作,例如:找出異常值、必要的一些數據轉換等。完成數據分析的最終結果也許就是做一個可交互的數據可視化。
  • Python數據可視化工具:Matplotlib學習筆記(一)
    今天要跟大家分享的內容📒是關於Python數據可視化方面的內容。Python在數據處理方面真的太厲害了,所以總結了部分筆記,分享給大家一起學習。簡介matplotlib是什麼?matplotlib是用python開發的可視化和分析工具,是一款非常強大的python畫圖工具。
  • Python數據分析基礎 | Matplotlib的用法
    Matplotlib可用於Python腳本,Python和IPython shell,Jupyters筆記本,Web應用程式伺服器和四個圖形用戶界面工具包。Matplotlib只需幾行代碼即可生成繪圖,條形圖、散點圖、箱線圖、折線圖、直方圖等,利用圖形,我們可以很快得出數據結論,得出業務解決方案。
  • Matplotlib數據可視化:柱狀圖與直方圖
    柱狀圖和直方圖是兩種非常類似的統計圖,區別在於:直方圖X軸為定量數據,柱狀圖X軸為分類數據。因此,直方圖上的每個條形都是不可移動的,X軸上的區間是連續的、固定的。而柱狀圖上的每個條形是可以隨意排序的,有的情況下需要按照分類數據的名稱排列,有的則需要按照數值的大小排列。直方圖條形寬度可不一,柱狀圖條形寬度須一致。
  • Python數據可視化——matplotlib使用
    %matplotlib inlineimport matplotlib.pyplot as pltfrom numpy.random import randnimport numpy as npfig=plt.figure()ax1=fig.add_subplot
  • Python數據分析利器:matplotlib超詳細基礎介紹!!!
    ,會讓你的數據分析等工作錦上添花,讓人印(升)象(職)深(加)刻(薪)。matplotlib是python優秀的數據可視化庫,python數據分析必備利器,本文專門為你整理了matplotlib詳細使用方法,來學習吧!--- 以下是正文 ---數據可視化非常重要,因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。
  • Python 繪圖,我只用 Matplotlib(一)
    或許你會疑惑,自己抓取這些數據有啥用?如果要拿去分析,那要怎麼分析呢?說到數據分析,Python 完全能夠勝任這方面的工作。Python 究竟如何在數據分析領域做到遊刃有餘?因為它有「四板斧」,分別是Matplotlib、NumPy、SciPy/Pandas。
  • Python中Matplotlib的類型
    市場上有許多可視化工具,它們可以通過從各種來源收集數據來生成自動圖表或圖形。Python是一種非常簡單的程式語言,在市場中廣泛用於承載數據科學工作以滿足業務需求。Python有自己的軟體包來顯示圖表或圖形。Python中的Matplotlib是用於顯示2D圖形的軟體包。
  • Python 繪圖庫 Matplotlib 入門教程
    筆者推薦大家通過pip的方式進行安裝,具體方法如下:sudo pip3 install matplotlib本文的代碼在如下環境中測試:Apple OS X 10.13Python 3.6.3matplotlib 2.1.1numpy 1.13.3介紹
  • python可視化之matplotlib
    ,這段時間決定給大家分享分享python可視化的內容,包括我們的matplotlib,Seaborn以及我們的pyecharts,這裡面涉及到我們常用的圖形,折線圖啊,柱狀圖啊,散點圖啊,箱形圖啊,3D圖啊等等~~ 今天就先給大家整理分享一下matplotlib吧~~在這裡呢我們的環境使用的是anconda環境,可惜今天看見了不該看的內容~~anconda自帶了我們常用的數據分析包所以我們不必再去為環境準備而發愁
  • 【乾貨】Python使用matplotlib實現數據可視化
    今天我們的主角是Python中的matplotlib庫(官網:http:// matplotlib.org),相對來說,matplotlib功能不是最強大的,但是對於基本的圖形來說,matplotlib很好用。
  • 機器學習:Python常用庫——Matplotlib庫
    說起數據分析,你的眼前有沒有浮現出直方圖、散點圖、曲線圖…各種圖表?Python作為一門程式語言,如何能作圖呢?辦法當然是有的,而且我們已經接觸過了。在上一章節中畫散點圖的時候就導入過,它就是Matplotlib。Matplotlib是Python的繪圖庫,具有豐富的繪圖功能,是數據可視化的好幫手!下面就看看如何用Matplotlib畫圖。
  • Python 語言的2D繪圖庫之 Matplotlib 入門教程
    筆者推薦大家通過pip的方式進行安裝,具體方法如下:sudo pip3 install matplotlib本文的代碼在如下環境中測試:Apple OS X 10.13Python 3.6.3matplotlib 2.1.1numpy 1.13.3介紹
  • Python數據可視化,無法繞過的matplotlib基礎知識!!!
    ,會讓你的數據分析等工作錦上添花,讓人印(升)象(職)深(加)刻(薪)。matplotlib是python優秀的數據可視化庫,python數據分析必備利器,本文專門為你整理了matplotlib詳細使用方法,來學習吧!--- 以下是正文 ---數據可視化非常重要,因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。