Matplotlib 系列之【繪製函式影像】

蔣志碧發表於2019-03-04

matplotlib 是 python 最著名的繪相簿,它提供了一整套和 matlab 相似的命令 API,十分適合互動式進行繪圖。

它的文件相當完備,並且 Gallery 頁面 中有上百幅縮圖,開啟之後都有源程式。因此如果你需要繪製某種型別的圖,只需要在這個頁面中瀏覽/複製/貼上一下,基本上都能搞定。

這是要實現的效果圖,利用 Matplotlib 繪製函式 y = x^2^ 的影像。

image

程式碼實現

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

# 設定 x,y 軸的範圍以及 label 標註
plt.xlim(-1,2)
plt.ylim(-2,3)
plt.xlabel(`x`)
plt.ylabel(`y`)

# 設定座標軸刻度線 
# Tick X 範圍 (-1,2) Tick Label(-1,-0.25,0.5,1.25,2) 刻度數量 5 個
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks)

# Tick Y 範圍(-2.2,-1,1,1.5,2.4) ,Tick Label (-2.2, -1, 1, 1.5, 2.4) 別名(下面的英文)
plt.yticks([-2.2,-1,1,1.5,2.4],
          [r`$really bad$`,r`$bad$`,r`$normal$`,r`$good$`,r`$really good$`])


# 設定座標軸 gca() 獲取座標軸資訊
ax=plt.gca()
# 使用.spines設定邊框:x軸;將右邊顏色設定為 none。
# 使用.set_position設定邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)
ax.spines[`right`].set_color(`none`)
ax.spines[`top`].set_color(`none`)

# 移動座標軸
# 將 bottom 即是 x 座標軸設定到 y=0 的位置。
ax.xaxis.set_ticks_position(`bottom`)
ax.spines[`bottom`].set_position((`data`,0))

# 將 left 即是 y 座標軸設定到 x=0 的位置。
ax.yaxis.set_ticks_position(`left`)
ax.spines[`left`].set_position((`data`,0))

# 設定標籤
ax.set_title(`y = x^2`,fontsize=14,color=`r`)

# 顯示影像
plt.show()
複製程式碼

首先一幅 Matplotlib 的影像組成部分介紹。

image

基本構成

在 matplotlib 中,整個影像為一個 Figure 物件。在 Figure 物件中可以包含一個或者多個 Axes 物件。每個 Axes(ax) 物件都是一個擁有自己座標系統的繪圖區域。

所屬關係如下(圖片來自網路):

image

圖上:Title 為影像標題,Axis 為座標軸, Label 為座標軸標註,Tick 為刻度線,Tick Label 為刻度註釋。

各個物件關係可以梳理成以下內容(圖片來自網路):

image

Matplotlib 繪圖步驟分析

image

注意

這裡不講解 matplotlib 的安裝,我使用的是 Anaconda 的 notebook,因此,可以直接匯入 matplotlib 的module,想要安裝 Anaconda 的請檢視的寫的另一篇文章。

如果說不想使用 Anaconda,可以看看這篇推薦文章,教你如何安裝 matplotlib(視訊和文章教程)— 莫煩 Python — Matplotlib

上面雖然貼了全部的程式碼,有 matplotlib 基礎的人一看便懂,但是對於初學者來說,就比較抓腦了。

一、matplotlib 實現簡單影像

image

使用 import 匯入模組 matplotlib.pyplot,並簡寫成 plt  使用 import 匯入模組 numpy,並簡寫成 np

#匯入 module
import matplotlib.pyplot as plt
import numpy as np
複製程式碼

使用 np.linspace 定義 x:範圍是 (-3,3),個數是50,模擬一維資料組 (x ,y) 表示曲線。

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2
複製程式碼

使用 plt.figure 定義一個影像視窗,使用 plt.plot 畫 (x ,y) 曲線,使用 plt.show 顯示影像。

#繪製及顯示
plt.figure()
plt.plot(x, y)
plt.show()
複製程式碼

最終程式碼

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

plt.figure()
plt.plot(x, y)
plt.show()
複製程式碼

執行結果

image

看到這個,是不是和最終效果圖差距很大,沒關係,我們接著往下看。

二、設定 Figure 影像

使用 plt.figure 定義一個影像視窗:編號為 3,大小為 (8, 5)。使用plt.plot畫(x ,y)曲線,曲線的顏色屬性(color)為紅色。曲線的寬度(linewidth)為1.0。曲線的型別(linestyle)為虛線, 使用plt.show顯示影像。

plt.figure(num=3,figsize=(8,5))
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)
複製程式碼

最終程式碼

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

plt.show()
複製程式碼

執行效果

image

三、設定座標軸

設定 x,y 軸座標範圍及標註 label

使用 plt.xlim 設定x座標軸範圍:(-1, 2); 使用 plt.ylim 設定 y 座標軸範圍:(-2, 3);

使用 plt.xlabel 設定 x 座標軸名稱:’x’; 使用 plt.ylabel 設定 y 座標軸名稱:’I am y’;

程式碼實現

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

# 設定 x,y 軸的範圍以及 label 標註
plt.xlim(-1,2)
plt.ylim(-2,3)
plt.xlabel(`x`)
plt.ylabel(`y`)

plt.show()
複製程式碼

執行結果

image
設定 x, y 刻度範圍及刻度標註

設定 x 軸 使用 np.linspace 定義範圍以及個數:範圍是(-1,2); 個數是 5。

使用 plt.xticks 設定 x 軸刻度:範圍是(-1,2); 個數是5。

設定 y 軸 使用 plt.yticks 設定 y 軸刻度以及名稱:刻度為 [-2, -1.8, -1, 1.22, 3];對應刻度的名稱為 [‘really bad’,’bad’,’normal’,’good’, ‘really good’]。

# 設定座標軸刻度線 
# Tick X 範圍 (-1,2) Tick Label(-1,-0.25,0.5,1.25,2) 刻度數量 5 個
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks)

# Tick Y 範圍(-2.2,-1,1,1.5,2.4) ,Tick Label (-2.2, -1, 1, 1.5, 2.4) 別名(下面的英文)
plt.yticks([-2.2,-1,1,1.5,2.4],
          [r`$really bad$`,r`$bad$`,r`$normal$`,r`$good$`,r`$really good$`])
複製程式碼

最終程式碼

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

# 設定 x,y 軸的範圍以及 label 標註
plt.xlim(-1,2)
plt.ylim(-2,3)
plt.xlabel(`x`)
plt.ylabel(`y`)

# 設定座標軸刻度線 
# Tick X 範圍 (-1,2) Tick Label(-1,-0.25,0.5,1.25,2) 刻度數量 5 個
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks)

# Tick Y 範圍(-2.2,-1,1,1.5,2.4) ,Tick Label (-2.2, -1, 1, 1.5, 2.4) 別名(下面的英文)
plt.yticks([-2.2,-1,1,1.5,2.4],
          [r`$really bad$`,r`$bad$`,r`$normal$`,r`$good$`,r`$really good$`])

# 顯示影像
plt.show()
複製程式碼

執行效果,注意看 x, y 軸刻度以及標註變化

image

四、移動座標軸

隱藏右邊框和上邊框

  1. 使用 plt.gca 獲取當前座標軸資訊。

  2. 使用 .spines 設定邊框:右側邊框;使用.set_color設定邊框顏色:預設白色;

    使用 .spines 設定邊框:上邊框;使用.set_color設定邊框顏色:預設白色;

調整座標軸至中心(將 left 邊框調整到 x=0 處,將 bottom 邊框調整到 y=0 處)

  1. 使用 .xaxis.set_ticks_position 設定 x 座標刻度數字或名稱的位置:bottom。(所有位置:topbottombothdefaultnone)。
  2. 使用 .spines 設定邊框:x 軸;使用 .set_position設定邊框位置:y=0 的位置;(位置所有屬性:outwardaxesdata
# 設定座標軸 gca() 獲取座標軸資訊
ax=plt.gca()
# 使用.spines設定邊框:x軸;將右邊顏色設定為 none。
# 使用.set_position設定邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)
ax.spines[`right`].set_color(`none`)
ax.spines[`top`].set_color(`none`)

# 移動座標軸
# 將 bottom 即是 x 座標軸設定到 y=0 的位置。
ax.xaxis.set_ticks_position(`bottom`)
ax.spines[`bottom`].set_position((`data`,0))

# 將 left 即是 y 座標軸設定到 x=0 的位置。
ax.yaxis.set_ticks_position(`left`)
ax.spines[`left`].set_position((`data`,0))
複製程式碼

最終程式碼

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

# 設定 x,y 軸的範圍以及 label 標註
plt.xlim(-1,2)
plt.ylim(-2,3)
plt.xlabel(`x`)
plt.ylabel(`y`)

# 設定座標軸刻度線 
# Tick X 範圍 (-1,2) Tick Label(-1,-0.25,0.5,1.25,2) 刻度數量 5 個
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks)

# Tick Y 範圍(-2.2,-1,1,1.5,2.4) ,Tick Label (-2.2, -1, 1, 1.5, 2.4) 別名(下面的英文)
plt.yticks([-2.2,-1,1,1.5,2.4],
          [r`$really bad$`,r`$bad$`,r`$normal$`,r`$good$`,r`$really good$`])

# 設定座標軸 gca() 獲取座標軸資訊
ax=plt.gca()
# 使用.spines設定邊框:x軸;將右邊顏色設定為 none。
# 使用.set_position設定邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)
ax.spines[`right`].set_color(`none`)
ax.spines[`top`].set_color(`none`)

# 移動座標軸
# 將 bottom 即是 x 座標軸設定到 y=0 的位置。
ax.xaxis.set_ticks_position(`bottom`)
ax.spines[`bottom`].set_position((`data`,0))

# 將 left 即是 y 座標軸設定到 x=0 的位置。
ax.yaxis.set_ticks_position(`left`)
ax.spines[`left`].set_position((`data`,0))

# 顯示影像
plt.show()
複製程式碼

執行結果

image

五、設定標題

使用 .set_title 設定標題,宣告標題為 y = x^2^,字型大小 14,顏色為 red。

# 設定標籤
ax.set_title(`y = x^2`,fontsize=14,color=`r`)
複製程式碼

最終程式碼

import matplotlib.pyplot as plt
import numpy as np

# 定義 x 變數的範圍 (-3,3) 數量 50 
x=np.linspace(-3,3,50)
y=x**2

# Figure 並指定大小
plt.figure(num=3,figsize=(8,5))
# 繪製 y=x^2 的影像,設定 color 為 red,線寬度是 1,線的樣式是 --
plt.plot(x,y,color=`red`,linewidth=1.0,linestyle=`--`)

# 設定 x,y 軸的範圍以及 label 標註
plt.xlim(-1,2)
plt.ylim(-2,3)
plt.xlabel(`x`)
plt.ylabel(`y`)

# 設定座標軸刻度線 
# Tick X 範圍 (-1,2) Tick Label(-1,-0.25,0.5,1.25,2) 刻度數量 5 個
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks)

# Tick Y 範圍(-2.2,-1,1,1.5,2.4) ,Tick Label (-2.2, -1, 1, 1.5, 2.4) 別名(下面的英文)
plt.yticks([-2.2,-1,1,1.5,2.4],
          [r`$really bad$`,r`$bad$`,r`$normal$`,r`$good$`,r`$really good$`])


# 設定座標軸 gca() 獲取座標軸資訊
ax=plt.gca()
# 使用.spines設定邊框:x軸;將右邊顏色設定為 none。
# 使用.set_position設定邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)
ax.spines[`right`].set_color(`none`)
ax.spines[`top`].set_color(`none`)

# 移動座標軸
# 將 bottom 即是 x 座標軸設定到 y=0 的位置。
ax.xaxis.set_ticks_position(`bottom`)
ax.spines[`bottom`].set_position((`data`,0))

# 將 left 即是 y 座標軸設定到 x=0 的位置。
ax.yaxis.set_ticks_position(`left`)
ax.spines[`left`].set_position((`data`,0))

# 設定標籤
ax.set_title(`y = x^2`,fontsize=14,color=`r`)

# 顯示影像
plt.show()
複製程式碼

執行結果

image

最後,附上 matplotlib 整體結構圖(圖片來自網路):

image

推薦閱讀

來北京的日子

這麼多年都白學了,原來是方法沒有用對

貝斯狸的 Python 之旅 — 深入切片操作及原理

牆裂推薦 Anaconda | 安利 Python IDE

程式設計界的半壁江山

好書推薦

統計學習方法

最近正在研究機器學習中的演算法和公式,朋友給我推薦了這本書,經過一番考察,總算是覺得這本書對得起讀者,也值得推薦。

李航,日本京都大學電氣工程系畢業,日本東京大學電腦科學博士。曾任職於日本 NEC 公司中央研究所,微軟亞洲研究院高階研究員及主任研究員,現任華為諾亞方舟實驗室首席科學家。北京大學、南開大學、西安交通大學客座教授。研究方向包括資訊檢索、自然語言處理、統計機器學習及資料探勘。

豆瓣簡介

詳細介紹支援向量機、Boosting、最大熵、條件隨機場等十個統計學習方法。

image

思維力:高效的系統思維

王世民,深圳爾雅 CEO,YouCore 創始人,知乎專欄“框架的力量”作者。

一個矛盾體。心裡挺鄙視學歷,但不小心念了名校、拿了碩士;崇尚個人自由,但又創辦公司綁死了自己;特不喜歡教書,但現在幹著培訓。一個不安分的人。短短十來年,當過苦逼的IT碼農、做過裝逼的諮詢顧問、現在幹著土鱉的民企老闆。

這本書對我的思維能力提升幫助蠻大的,書中提供的很多學習方法都值得借鑑,自從閱讀了本書以後,我也喜歡畫腦圖總結,不斷嘗試系統學習。我強烈建議讀者們去看看【框架的力量】的專欄,對提高你的思維和學習效率很有幫助。

豆瓣簡介

“真正有用”正是這本書不同於其它思維書籍之處!

你有沒有遇到過以下窘境——分析時想不明白、表達時說不清楚、學習時學不快速?你想不想全面提升你的思維能力?你知道問題解決技巧和表達技巧有哪些嗎?

此書中有你想知道的答案。

本書分為 3 個部分共 10 章,各章可自成體系地解決一個問題,同時整書又形成一套體系化的系統思維。

第一部分探祕了“框架”力量的根源。萬事萬物的本質其實是一個個的系統,而掌握了系統的“框架”也就把握了事物的本質。沒有什麼問題是不能利用框架解決的,如果一個不行,那就兩個。

第二部分將運用“框架”解決問題分解為五個步驟——界定問題、構建框架、明晰關鍵、高效執行及檢查調整,並精煉了相應的優秀思考方法和工具。此外,還傳授了在有限時間、有限資源限制下高質量地解決問題的祕訣——“假設思考”。

第三部分傳授如何運用“框架”有效表達。逐層遞進地演示了自上而下表達的魅力,並用豐富的圖表闡述了何為“形象化表達”。

對於想全面提升思維能力的讀者,建議按照本書章節順序閱讀;對於迫切想尋求具體問題解決技巧或表達技巧的讀者,也可以直接閱讀相應章節。

image

想要書籍的請在後臺留言【180803】獲取這兩本書的 PDF 版,【思維力:高效的系統思維】附視訊教程,希望在學習的道路上,我們能少走彎路,我會盡量推薦自己讀過的好書,希望讀者們能跟著我一起多讀書,讀好書。

image

相關文章