【機器學習科學庫】全md文件筆記:Matplotlib詳細使用方法(已分享,附程式碼)

程序员一诺發表於2024-02-26

本系列文章md筆記(已分享)主要討論人工智慧相關知識。主要內容包括,瞭解機器學習定義以及應用場景,掌握機器學習基礎環境的安裝和使用,掌握利用常用的科學計算庫對資料進行展示、分析,學會使用jupyter notebook平臺完成程式碼編寫執行,應用Matplotlib的基本功能實現圖形顯示,應用Matplotlib實現多圖顯示,應用Matplotlib實現不同畫圖種類,學習Numpy運算速度上的優勢,知道Numpy的陣列記憶體塊風格,瞭解Numpy與Pandas的不同,學習Pandas的使用,應用crosstab和pivot_table實現交叉表與透視表,應用Pandas實現資料的讀取和儲存,並且瞭解完整機器學習專案的流程。

全套筆記程式碼自取gitee倉庫:

請移步這裡獲取文件和程式碼

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~


共 7 章,33 子模組

Matplotlib

學習目標

  • 應用Matplotlib的基本功能實現圖形顯示
  • 應用Matplotlib實現多圖顯示
  • 應用Matplotlib實現不同畫圖種類

3.2 基礎繪圖功能 — 以折線圖為例

學習目標

  • 目標

    • 掌握給圖形新增輔助功能(如:標註、x,y軸名稱、標題等)
    • 知道圖形的儲存
    • 知道如何多次plot繪製圖形
    • 知道如何多個座標系顯示圖形
    • 知道折線圖的應用場景

1 完善原始折線圖 — 給圖形新增輔助功能

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

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

效果:

上海1

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

import matplotlib.pyplot as plt
import random

  
  
# 畫出溫度變化圖
  
  

  
  
# 0.準備x, y座標的資料
  
  
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]

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

  
  
# 2.繪製折線圖
  
  
plt.plot(x, y_shanghai)

  
  
# 3.顯示影像
  
  
plt.show()

上海2

1.2 新增自定義x,y刻度

  • plt.xticks(x, **kwargs)

x:要顯示的刻度值

  • plt.yticks(y, **kwargs)

y:要顯示的刻度值

  
  
# 增加以下兩行程式碼
  
  

  
  
# 構造x軸刻度標籤
  
  
x_ticks_label = ["11點{}分".format(i) for i in x]
  
  
# 構造y軸刻度
  
  
y_ticks = range(40)

  
  
# 修改x,y軸座標的刻度顯示
  
  
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

上海3

如果沒有解決過中文問題的話,會顯示這個樣子:

中文問題

1.3 中文顯示問題解決

解決方案一:

下載中文字型(黑體,看準系統版本)

  • 步驟一:下載 SimHei 字型(或者其他的支援中文顯示的字型也行)
  • 步驟二:安裝字型

    • linux下:複製字型到 usr/share/fonts 下:
    sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
  • windows和mac下:雙擊安裝
  • 步驟三:刪除~/.matplotlib中的快取檔案
cd ~/.matplotlib
rm -r *
  • 步驟四:修改配置檔案matplotlibrc
vi ~/.matplotlib/matplotlibrc

將檔案內容修改為:

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

解決方案二:

在Python指令碼中動態設定matplotlibrc,這樣也可以避免由於更改配置檔案而造成的麻煩,具體程式碼如下:

from pylab import mpl
  
  
# 設定顯示中文字型
  
  
mpl.rcParams["font.sans-serif"] = ["SimHei"]

有時候,字型更改後,會導致座標軸中的部分字元無法正常顯示,此時需要更改axes.unicode_minus引數:

  
  
# 設定正常顯示符號
  
  
mpl.rcParams["axes.unicode_minus"] = False

1.4 新增網格顯示

為了更加清楚地觀察圖形對應的值

plt.grid(True, linestyle='--', alpha=0.5)

1.5 新增描述資訊

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

透過fontsize引數可以修改影像中字型的大小
plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("中午11點0分到12點之間的溫度變化圖示", fontsize=20)

1.6 影像儲存

  
  
# 儲存圖片到指定路徑
  
  
plt.savefig("test.png")
  • 注意:plt.show()會釋放figure資源,如果在顯示影像之後儲存圖片將只能儲存空圖片。

完整程式碼:

import matplotlib.pyplot as plt
import random
from pylab import mpl

  
  
# 設定顯示中文字型
  
  
mpl.rcParams["font.sans-serif"] = ["SimHei"]
  
  
# 設定正常顯示符號
  
  
mpl.rcParams["axes.unicode_minus"] = False

  
  
# 0.準備資料
  
  
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]

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

  
  
# 2.繪製影像
  
  
plt.plot(x, y_shanghai)

  
  
# 2.1 新增x,y軸刻度
  
  
  
  
# 構造x,y軸刻度標籤
  
  
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

  
  
# 刻度顯示
  
  
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

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

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

  
  
# 2.4 影像儲存
  
  
plt.savefig("./test.png")

  
  
# 3.影像顯示
  
  
plt.show()

2 在一個座標系中繪製多個影像

2.1 多次plot

需求:再新增一個城市的溫度變化

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

  
  
# 增加北京的溫度資料
  
  
y_beijing = [random.uniform(1, 3) for i in x]

  
  
# 繪製折線圖
  
  
plt.plot(x, y_shanghai)
  
  
# 使用多次plot可以畫多個折線
  
  
plt.plot(x, y_beijing, color='r', linestyle='--')

我們仔細觀察,用到了兩個新的地方,一個是對於不同的折線展示效果,一個是新增圖例。

2.2 設定圖形風格

顏色字元風格字元
r 紅色- 實線
g 綠色- - 虛線
b 藍色-. 點劃線
w 白色: 點虛線
c 青色' ' 留空、空格
m 洋紅
y 黃色
k 黑色

2.3 顯示圖例

  • 注意:如果只在plt.plot()中設定label還不能最終顯示出圖例,還需要透過plt.legend()將圖例顯示出來。
  
  
# 繪製折線圖
  
  
plt.plot(x, y_shanghai, label="上海")
  
  
# 使用多次plot可以畫多個折線
  
  
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")

  
  
# 顯示圖例
  
  
plt.legend(loc="best")
Location StringLocation Code
'best'0
'upper right'1
'upper left'2
'lower left'3
'lower right'4
'right'5
'center left'6
'center right'7
'lower center'8
'upper center'9
'center'10

完整程式碼:

  
  
# 0.準備資料
  
  
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]

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

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

  
  
# 2.1 新增x,y軸刻度
  
  
  
  
# 構造x,y軸刻度標籤
  
  
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

  
  
# 刻度顯示
  
  
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

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

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

  
  
# 2.4 影像儲存
  
  
plt.savefig("./test.png")

  
  
# 2.5 新增圖例
  
  
plt.legend(loc=0)


  
  
# 3.影像顯示
  
  
plt.show()

2.4 練一練

練習多次plot流程(從上面複製程式碼,到自己電腦,確保每人環境可以正常執行),

同時明確每個過程執行實現的具體效果

3 多個座標系顯示— plt.subplots(物件導向的畫圖方法)

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

image-20190317134820901

可以透過subplots函式實現(舊的版本中有subplot,使用起來不方便),推薦subplots函式

  • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 建立一個帶有多個axes(座標系/繪圖區)的圖
Parameters:    

nrows, ncols : 設定有幾行幾列座標系
    int, optional, default: 1, Number of rows/columns of the subplot grid.

Returns:    
fig : 圖物件
axes : 返回相應數量的座標系

設定標題等方法不同:
    set_xticks
    set_yticks
    set_xlabel
    set_ylabel

關於axes子座標系的更多方法:參考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

  • 注意:plt.函式名()相當於程序導向的畫圖方法,axes.set_方法名()相當於物件導向的畫圖方法。
  
  
# 0.準備資料
  
  
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]

  
  
# 1.建立畫布
  
  
  
  
# plt.figure(figsize=(20, 8), dpi=100)
  
  
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)


  
  
# 2.繪製影像
  
  
  
  
# plt.plot(x, y_shanghai, label="上海")
  
  
  
  
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
  
  
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")

  
  
# 2.1 新增x,y軸刻度
  
  
  
  
# 構造x,y軸刻度標籤
  
  
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

  
  
# 刻度顯示
  
  
  
  
# plt.xticks(x[::5], x_ticks_label[::5])
  
  
  
  
# plt.yticks(y_ticks[::5])
  
  
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

  
  
# 2.2 新增網格顯示
  
  
  
  
# plt.grid(True, linestyle="--", alpha=0.5)
  
  
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

  
  
# 2.3 新增描述資訊
  
  
  
  
# plt.xlabel("時間")
  
  
  
  
# plt.ylabel("溫度")
  
  
  
  
# plt.title("中午11點--12點某城市溫度變化圖", fontsize=20)
  
  
axes[0].set_xlabel("時間")
axes[0].set_ylabel("溫度")
axes[0].set_title("中午11點--12點某城市溫度變化圖", fontsize=20)
axes[1].set_xlabel("時間")
axes[1].set_ylabel("溫度")
axes[1].set_title("中午11點--12點某城市溫度變化圖", fontsize=20)

  
  
# # 2.4 影像儲存
  
  
plt.savefig("./test.png")

  
  
# # 2.5 新增圖例
  
  
  
  
# plt.legend(loc=0)
  
  
axes[0].legend(loc=0)
axes[1].legend(loc=0)


  
  
# 3.影像顯示
  
  
plt.show()

4 折線圖的應用場景

  • 呈現公司產品(不同區域)每天活躍使用者數
  • 呈現app每天下載數量
  • 呈現產品新功能上線後,使用者點選次數隨時間的變化
  • 擴充:畫各種數學函式影像

    • 注意:plt.plot()除了可以畫折線圖,也可以用於畫各種數學函式影像

程式碼:

import numpy as np
  
  
# 0.準備資料
  
  
x = np.linspace(-10, 10, 1000)
y = np.sin(x)

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

  
  
# 2.繪製函式影像
  
  
plt.plot(x, y)
  
  
# 2.1 新增網格顯示
  
  
plt.grid()

  
  
# 3.顯示影像
  
  
plt.show()

5 小結

  • 新增x,y軸刻度【知道】

    • plt.xticks()
    • plt.yticks()
    • 注意:在傳遞進去的第一個引數必須是數字,不能是字串,如果是字串嗎,需要進行替換操作
  • 新增網格顯示【知道】

    • plt.grid(linestyle="--", alpha=0.5)
  • 新增描述資訊【知道】

    • plt.xlabel()
    • plt.ylabel()
    • plt.title()
  • 影像儲存【知道】

    • plt.savefig("路徑")
  • 多次plot【瞭解】

    • 直接進行新增就OK
  • 顯示圖例【知道】

    • plt.legend(loc="best")
    • 注意:一定要在plt.plot()裡面設定一個label,如果不設定,沒法顯示
  • 多個座標系顯示【瞭解】

    • plt.subplots(nrows=, ncols=)
  • 折線圖的應用【知道】

    • 1.應用於觀察資料的變化
    • 2.可是畫出一些數學函式影像

未完待續, 同學們請等待下一期

全套筆記程式碼自取gitee倉庫:

請移步這裡獲取文件和程式碼

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~

相關文章