機器學習聽課 | 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) Figure
是Canvas
上方的第一層,也是需要使用者來操作的應用層的第一層.
我們不需要關注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)