1. 程式人生 > >Python 資料分析與展示筆記3 -- Matplotlib 庫基礎

Python 資料分析與展示筆記3 -- Matplotlib 庫基礎

Python 資料分析與展示筆記3 – Matplotlib 庫基礎


Python 資料分析與展示系列筆記是筆者學習、實踐Python 資料分析與展示的相關筆記

課程連結: Python 資料分析與展示

參考文件:
Numpy 官方文件(英文)
Numpy 官方文件(中文)
PIL 官方文件
Matplotlib 官方文件


一、Matplotlib 庫


Matplotlib 是一個 Python 的 2D繪相簿,它以各種硬拷貝格式和跨平臺的互動式環境生成出版質量級別的圖形。

1、安裝與匯入

# 安裝
pip install matplotlib

# 匯入,常用的是他的繪圖子模組 pyplot
import matplotlib.pyplot as plt

2、測試

import matplotlib.pyplot as plt

plt.plot([2, 1, 4, 5, 3])
plt.show()

在這裡插入圖片描述


二、庫基本繪圖


Matplotlib 繪圖預設有一個畫布,所有的繪圖設定及操作是對同一個畫布進行的,多次plot()會產生覆蓋


1、繪圖函式:plot()

函式原型:

plt.plot(x, y, format_string, **kwargs)

引數:

  • x:X軸資料,列表或陣列,可選
  • y:Y軸資料,列表或陣列,如果沒有給定x,則預設 x 軸的值為對應的 y 的下標
  • format_string:控制曲線的格式字串,可選
  • **kwargs:多組的(x, y, format_string),繪製多條曲線,各條曲線的x不能省略

format_string: 由顏色字元、風格字元和標記字元組成,可自由組合

顏色字元 說明
‘b’ 藍色
‘g’ 綠色
‘r’ 紅色
‘c’ 青綠色
‘#008000’ RGB某顏色
‘m’ 洋紅色magenta
‘y’ 黃色
‘k’ 黑色
‘w’ 白色
‘0.8’ 灰度值字串
風格字元 說明
‘‐’ 實線
‘‐‐’ 破折線
‘‐.’ 點劃線
‘:’ 虛線
’ ’ 無線條
標記字元 說明
‘.’ 點標記
‘,’ 畫素標記(極小點)
‘o’ 實心圈標記
‘v’ 倒三角標記
‘^’ 上三角標記
‘>’ 右三角標記
‘<’ 左三角標記
‘1’ 下花三角標記
‘2’ 上花三角標記
‘3’ 左花三角標記
‘4’ 右花三角標記
‘s’ 實心方形標記
‘p’ 實心五角標記
‘*’ 星形標記
‘h’ 豎六邊形標記
‘H’ 橫六邊形標記
‘+’ 十字標記
‘x’ x標記
‘D’ 菱形標記
‘d’ 瘦菱形標記
‘|’ 垂直線標記

示例:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a*1.5, 'go-', a, a*2.5, 'rx:', a, a*3.5, '*', a, a*4.5, 'b-.')
plt.show()

在這裡插入圖片描述

2、座標圖格式控制

# 設定 x,y 軸範圍
plt.axis([x軸左點,x軸右點,y軸下點,y軸上點])

# 網格設定,True為顯示網格,預設不顯示
plt.grid(True)

# 顯示
plt.show()

# 儲存,PNG格式
plt.savefig('圖片路徑',dpi = 每英寸點數)

3、顯示中文

全域性設定: 修改 rcParams 字典

import matplotlib

matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.size'] = 20
  • rcParams 屬性
屬性 說明
‘font.family’ 用於顯示字型的名字
‘font.style’ 字型風格,正常’normal’或斜體’italic’
‘font.size’ 字型大小,整數字號或者’large’、‘x‐small’
  • 中文字型
中文字型 說明
‘SimHei’ 中文黑體
‘Kaiti’ 中文楷體
‘LiSu’ 中文隸書
‘FangSong’ 中文仿宋
‘YouYuan’ 中文幼圓
‘STSong’ 華文宋體

區域性設定: 每個需要繪製文字的函式中單獨設定文字的相關屬性

屬性 說明
fontproperties 字型型別
fontsize 字型大小

4、文字顯示

函式 說明
plt.xlabel(‘x軸標籤’) 對X軸增加文字標籤
plt.ylabel(‘y軸標籤’) 對Y軸增加文字標籤
plt.title(‘圖名’) 對圖形整體增加文字標籤
plt.text(x座標,y座標,‘文字’) 在任意位置增加文字
plt.annotate() 在圖形中增加帶箭頭的註解

plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)

  • s:註解的字串
  • xy:箭頭座標(x, y)
  • xytext:文字座標(x, y)
  • arrowprops:箭頭格式,字典

示例:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a))

plt.xlabel('橫軸:時間', fontproperties='SimHei', fontsize=20, color='red')
plt.ylabel('縱軸:振幅', fontproperties='SimHei', fontsize=20)
plt.title(r'正弦波$y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5), fontsize=15,
             arrowprops=dict(facecolor='black', shrink=0.1, width=2))

plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()

在這裡插入圖片描述

5、繪圖區域:劃分子圖

簡單的繪圖區域劃分:

  • 一次只能選擇一個子圖,子圖的編號從1開始
  • 可以重新劃分區域,但是選擇的子圖不能與之前的有交集,否則會覆蓋之前的
  • plt.subplot(nrows, ncols, plot_number)
    • nrows:分為幾行
    • ncols:分為幾列
    • plot_number:當前要繪製的子圖號,從左到右從上到下編號
import matplotlib.pyplot as plt
import numpy as np

a = np.arange(0.0, 5.0, 0.02)
# 第一個子圖
plt.subplot(211)
plt.plot(a, np.cos(a))
# 第二個子圖
plt.subplot(223)
plt.plot(a, np.sin(a))
# 第三個子圖
plt.subplot(224)
plt.plot(a, a/5)

plt.show()

在這裡插入圖片描述

複雜的繪圖區域劃分:

  • 劃分繪圖區域網格時,行列的編號都從0開始
  • 選擇子圖時,可以按多行多列區域選中
  • plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
    • GridSpec:網格的行列數,元組形式,(rows,cols)
    • CurSpec:選中子圖的起始網格座標,元組形式,(row, col)
    • colspan:子圖的長,即列數
    • rowspan:子圖的高,即行數
import matplotlib.pyplot as plt
import numpy as np

a = np.arange(0.0, 5.0, 0.02)
# 第一個子圖
plt.subplot2grid((2, 3), (0, 0), colspan=3)
plt.plot(a, np.cos(a))
plt.title('a')
# 第二個子圖
plt.subplot2grid((2, 3), (1, 0), colspan=2)
plt.plot(a, np.sin(a))
plt.title('b')
# 第三個子圖
plt.subplot2grid((2, 3), (1, 2))
plt.plot(a, a/5)
plt.title('c')
plt.show()

在這裡插入圖片描述

GridSpec 類:

  • 用於複雜的繪圖區域劃分,子圖選擇更方便
  • 採用切片的方法選擇子圖
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gs

g = gs.GridSpec(2, 3)
a = np.arange(0.0, 5.0, 0.02)

# 第一個子圖
ax1 = plt.subplot(g[0, :-1])
ax1.plot(a, np.cos(a))
# 第二個子圖
ax2 = plt.subplot(g[0:2, 2])
ax2.plot(a, np.sin(a))
# 第三個子圖
ax3 = plt.subplot(g[1, 0])
ax3.plot(a, a/5)

plt.show()

在這裡插入圖片描述


三、面向物件繪圖


Matplotlib繪圖可以採用面向物件的方式,即可以建立(例項化)多個畫布,分別對不同的畫布進行操作,多一個畫布可以多次 plot() 不會覆蓋


1、建立新畫布:plt.figure()

函式原型:

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, clear=False, **kwargs)[source]

引數:

  • num:整數或字串,可選,預設值:無。畫布的編號,如果未提供,將建立新圖形,並且圖形編號將自動遞增。畫布物件將此數字儲存在 number 屬性中。如果提供了num且存在該num的畫布,返回對它的引用。如果此畫布不存在,則建立並返回畫布物件。如果num是一個字串,則顯示畫布的視窗標題為 num。
  • figsize:整數元組,可選,預設值:無。單位為英寸。如果未提供,則預設為 rcParams[“figure.figsize”]= [6.4, 4.8]
  • dpi:整數,可選,預設值:無。畫布的每英寸點數。如果未提供,則預設為 rcParams[“figure.dpi”]= 100
  • facecolor:背景顏色。如果未提供,則預設為白色 rcParams[“figure.facecolor”]= ‘w’
  • edgecolor:邊框顏色。如果未提供,則預設為白色 rcParams[“figure.edgecolor”]= ‘w’。
  • frameon:bool,optional,預設值:True,如果為False,則禁止繪製圖框
  • FigureClass:Figure的 子類,(可選)使用自定義Figure例項
  • clear:bool,可選,預設值:False,如果為True並且該圖已經存在,那麼它將被清除

返回:

  • 返回畫布物件
  • 如果要建立許多畫布,確保明確呼叫 plt.close() 釋放未使用的畫布,使pyplot可以正確清理記憶體
  • rcParams定義的預設值,可以在 matplotlibrc 檔案中修改

示例:

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(0, 5.0, 0.02)

# 建立畫布
fig1 = plt.figure(num='fig', figsize=(6, 4))
plt.plot(a, np.cos(a), c="red", label="cos")
plt.plot(a, np.sin(a), c="blue", label="sin")
# 設定圖例的位置
plt.legend(loc="best")

# 嵌入小圖,位置為畫布的比例
left, bottom, width, height = 0.2, 0.2, 0.2, 0.1
ax1 = fig1.add_axes([left, bottom, width, height])
ax1.plot(a, a)

plt.show()

在這裡插入圖片描述


GOOD LUCK!