1. 程式人生 > 實用技巧 >機器學習聽課 | Matplotlib | 02

機器學習聽課 | Matplotlib | 02

目錄

Matplotlib之HelloWorld

什麼是Matplotlib


(1) 是專門用於開發2D圖表(包括3D圖表,但是不擅長)
(2) 使用起來簡單方便
(3) 以漸進,互動式方式實現資料視覺化

為什麼要學習Matplotlib

視覺化是在整個資料探勘過程的關鍵輔助工具,可以清晰的理解資料,從而調整我們的分析方法.
(1) 能將資料進行視覺化,更直觀的呈現
(2) 使資料更加客觀,更具說服力.

例如下圖,左邊是使用數字展示,右邊是使用影象展示,顯然是右圖更加直觀清晰.

實現一個簡單的Matplotlib畫圖

matplotlib實現畫圖的三個步驟:
(1) 建立畫布 plt.figure([figsize=(..,..),dpi=..])
(2) 繪製圖像 plt.plot(x,y)


(3) 顯示影象 plt.show()

Matplotlib三層結構

容器層

容器層主要由Canvas,Figure,Axes組成.
(1) Canvas是位於最底層的系統層,在繪圖的過程中充當畫板的角色,即放置畫布(Figure)的工具.
(2) FigureCanvas上方的第一層,也是需要使用者來操作的應用層的第一層.
我們不需要關注Canvas. 做比喻的話, Canvas就是畫板,Figure就是畫紙.
(3) Axes是應用層的第二層,在繪圖過程中相當於畫布上的繪圖區的角色.
* figure: 指整個圖形(可以通過plt.figure()設定畫布的大小和解析度等)
* axes(座標系/繪圖區)

: 資料的繪圖區域
* axis(座標軸): 座標系中的一條軸,包含大小限制,刻度和刻度標籤

輔助顯示層

輔助顯示層為Axes(繪圖區)內的除了根據資料繪製出的影象以外的內容.
主要包括Axes的外觀facecolor,邊框線spines,座標軸axis,座標軸名稱axis label
座標軸刻度axis tick,座標軸刻度標籤tick label,網格線grid,圖例legend,標題title

該層的設定可使影象顯示更加直觀更加容易被使用者理解,但又不會對影象產生實質的影響.

影象層

影象層指Axes內通過plot,scatter,bar,histogram,pie等函式根據資料繪製出的影象.

折線圖(plot)與基礎繪圖功能

折線圖繪製與儲存圖片

為了更好地理解所有基礎繪圖功能,我們通過天氣溫度變化的繪圖來融合所有的基礎API使用.

matplotlib.pyplot模組

matplotlijb.pyplot包含了一系列類似於matlab的畫圖函式.
它的函式作用於當前影象figure的當前座標系axes.

import matplotlib.pyplot as plt

折線圖繪製與顯示

展示上海一週的天氣,比如從星期一到星期天的天氣溫度

可以看到這樣的顯示效果並不好,我們可以加入更多的功能.

設定畫布屬性與圖片儲存

plt.figure(figsize=(),dpi=...)
# figsize: 指定圖的長寬
# dpi: 影象的清晰度
# 返回fig物件

plt.savefig(path)
# 儲存圖片路徑

例:

# 1.建立畫布,並設定畫布屬性
plt.figure(figsize=(20, 8), dpi=80)
# 2.儲存圖片到指定路徑
plt.savefig("test.png")

注意: plt.show()會釋放figure資源,如果在顯示影象之後儲存圖片只能儲存空圖片.

完善原始折線圖1 -- 輔助顯示層

案例: 顯示溫度變化狀況
需求: 畫出某城市11點到12點1小時內每分鐘的溫度變化折線圖,溫度範圍在15度~18度.

效果如下圖:

準備資料並畫出初始折線圖

新增自定義x,y刻度

plt.xticks(x,x_label)
# x: 要顯示的刻度值(必須是數值)

plt.yticks(y,y_label)
# y: 要顯示的刻度值(必須是數值)

中文顯示問題解決

(1) 臨時解決方法
在使用中文之前加上以下兩行程式碼

matplotlib.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False

(2) 從配置上解決
首先沒有字型需要先現在字型,然後反映在對應的地方.
一般是下載SimHei字型.
linux下載完字型後需要拷貝到usr/share/fonts
windows下載完字型後直接安裝即可.

刪除~/.matplotlib中的快取檔案

cd ~/.matplotlib
rm -r *

修改配置檔案matplotlibrc

vi ~/.matplotlib/matplotlibrc

將檔案內容修改為

font.family         : sans-serif
font.sans-serif         : SimHei
axes.unicode_minus  : False

新增網格顯示

plt.grid(True[,linestyle='--',alpha=0.5])
# 增加網格,更加清楚的看到網格對應的值

新增描述資訊

新增x軸,y軸描述資訊以及標題

plt.xlabel(...)
plt.ylabel(...)
plt.title(...)

完善原始折線圖2 -- 影象層

多次plot

需求: 在新增一個城市的問題變化

收集到北京當天溫度變化情況,溫度在1度到3度.
怎麼去新增另一個在同一個座標軸(繪圖區)當中的不同圖形?
其實很簡單,只需要再次plot即可,但是需要區分線條.
如下圖所示:

plt.legend(loc="best") 
# 增加圖例

plt.plot(x,y[,color=..,linestyle=..,label=..])
# 繪製折線圖

設定風格

顯示圖例

注意: 如果只在plt.plot()中設定label還不能最終顯示出圖例,還需要通過plt.legend()將圖例顯示出來.

plt.legend(loc="best")

完整程式碼:

import random

# 多次plot
# 0.建立資料
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(-5, 5) for i in x]

# 1.建立畫布
plt.figure(figsize=(20, 8), dpi=100)

# 2.繪製圖
plt.plot(x, y_shanghai, label="上海", color="r", linestyle="--")
plt.plot(x, y_beijing, label="北京")

# 2.1 新增x,y軸的刻度
x_labels_ticks = ["11點{}分".format(i) for i in x]
y_labels_ticks = range(-10, 30)

plt.xticks(x[::5], x_labels_ticks[::5])
plt.yticks(y_labels_ticks[::5])

# 2.2 新增網格線
plt.grid(linestyle="--", alpha=0.5)

# 2.3 新增描述資訊
plt.xlabel("時間", fontsize=16)
plt.ylabel("溫度", fontsize=16)
plt.title("某城市11點-12點溫度變化", fontsize=20)

# 2.4 增加圖例
plt.legend(loc="best")

# 3.顯示
plt.show()

多個座標系(繪圖區)顯示

顯示多個繪圖區,這裡推薦使用plt.subplots(),面向物件的畫圖方法

如果我們想要將上海和北京的天氣圖顯示在同一個圖的不同座標,效果如下:

fig,axes = subplots(nrow=x,ncol=y[,figsize=(..),dpi=...])
# fig 圖物件
# axes/ax 一個繪圖區的陣列

# 設定標題等方法不同
set_xticks()
set_yticks()
set_xlabel()
set_ylabel()
set_title()

折線圖的應用場景

折線圖就是用來展示變數之間的關係
比如:
呈現公司產品(不同區域)每天活躍使用者數
呈現app每天下載數量
呈現新功能上線後,使用者點選次數隨時間的變化

注意: plt.plot還可以畫各種數學的函式影象

常見圖形繪製

(1) 折線圖
能夠顯示資料的變化趨勢,反映事物的變化情況(變化)
plt.plot()
(2) 散點圖
判斷變數之間是否存在數量關係趨勢,展示離群點(分佈規律)
plt.scatter()
(3) 柱狀圖
繪製離散的資料,能夠一眼看出各個資料的大小,比較資料之間的差別(統計/對比)
plt.bar(x,width,align="center")
(4) 直方圖
繪製連續性的資料展示,展示一組或多組的分佈狀況(統計)
plt.hist(x,bins)
(5) 餅圖
用於表示不同分類情況的佔比,通過弧度大小來對比各種分類
plt.pie(x,labels,autopct,colors)