hans

hans

【Python】五、Matplotlib——《用Python做科學計算》


matplotlib
是 python 最著名的繪圖庫,它提供了一整套和 matlab 相似的命令 API,十分適合互動式地進行製圖。而且也可以方便地將它作為繪圖控件,嵌入 GUI 應用程序中。

它的文檔相當完備,並且 http://matplotlib.org/gallery.html
中有上百幅縮略圖,打開之後都有源程序。因此如果你需要繪製某種類型的圖,只需要在這個頁面中瀏覽 / 複製 / 粘貼一下,基本上都能搞定。

本章節作為 matplotlib 的入門介紹,將較為深入地挖掘幾個例子,從中理解和學習 matplotlib 繪圖的一些基本概念。

1. 快速繪圖#

matplotlib 的 pyplot 子庫提供了和 matlab 類似的繪圖 API,方便用戶快速繪製 2D 圖表。讓我們先來看一個簡單的例子:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)

plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()

1668632373606.jpg

調用 figure 創建一個繪圖對象,並且使它成為當前的繪圖對象。

plt.figure(figsize=(8,4))

也可以不創建繪圖對象直接調用接下來的 plot 函數直接繪圖,matplotlib 會為我們自動創建一個繪圖對象。如果需要同時繪製多幅圖表的話,可以是給 figure 傳遞一個整數參數指定圖標的序號,如果所指定序號的繪圖對象已經存在的話,將不創建新的對象,而只是讓它成為當前繪圖對象。

通過 figsize 參數可以指定繪圖對象的寬度和高度,單位為英寸;dpi 參數指定繪圖對象的分辨率,即每英寸多少個像素,缺省值為 80。因此本例中所創建的圖表窗口的寬度為 8*80
= 640 像素。
下面的兩行程序通過調用 plot 函數在當前的繪圖對象中進行繪圖:

plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

plot 函數的調用方式很靈活,第一句將 x,y 數組傳遞給 plot 之後,用關鍵字參數指定各種屬性:
label :
給所繪製的曲線一個名字,此名字在圖示 (legend) 中顯示。只要在字符串前後添加 "$" 符號,matplotlib 就會使用其內嵌的 latex 引擎繪制的數學公式。
color : 指定曲線的顏色
linewidth : 指定曲線的寬度
第二句直接通過第三個參數 "b--" 指定曲線的顏色和線型,這個參數稱為格式化參數,它能夠通過一些易記的符號快速指定曲線的樣式。其中 b 表示藍色,"--" 表示線型為虛線。在 IPython 中輸入
"plt.plot?" 可以查看格式化字符串的詳細配置。
接下來通過一系列函數設置繪圖對象的各個屬性:

plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()

xlabel : 設置 X 軸的文字
ylabel : 設置 Y 軸的文字
title : 設置圖表的標題
ylim : 設置 Y 軸的範圍
legend : 顯示圖示
最後調用 plt.show () 顯示出我們創建的所有繪圖對象。

2. 繪製多軸圖#

一個繪圖對象 (figure) 可以包含多個軸 (axis),在 Matplotlib 中用軸表示一個繪圖區域,可以將其理解為子圖。上面的第一個例子中,繪圖對象只包括一個軸,因此只顯示了一個軸 (子圖)。我們可以使用 subplot 函數快速繪製有多個軸的圖表。subplot 函數的調用形式如下:

subplot(numRows, numCols, plotNum)

subplot 將整個繪圖區域等分為 numRows 行 *
numCols 列個子區域,然後按照從左到右,從上到下的順序對每個子區域進行編號,左上的子區域的編號為 1。如果 numRows,numCols 和 plotNum 這三個數都小於 10 的話,可以把它們縮寫為一個整數,例如 subplot (323) 和 subplot (3,2,3) 是相同的。subplot 在 plotNum 指定的區域中創建一個軸對象。如果新創建的軸和之前創建的軸重疊的話,之前的軸將被刪除。

下面的程序創建 3 行 2 列共 6 個軸,通過 axisbg 參數給每個軸設置不同的背景顏色。

for idx, color in enumerate("rgbyck"):
    plt.subplot(320+idx+1, axisbg=color)
plt.show()

1668632479996.jpg


enumerate 是舉列舉的意思,主要使用對象是列表(list)和字符串(string)。enumerate 將其組成一個索引序列,利用它可以同時獲得索引(index)和內容(item)

list = ["a", "b", "c", "d"]
for index, item in enumerate(list):
    print index, item
>>>
0 a
1 b
2 c
3 d

如果希望某個軸佔據整個行或者列的話,可以如下調用 subplot:

plt.subplot(221) # 第一行的左圖
plt.subplot(222) # 第一行的右圖
plt.subplot(212) # 第二整行
plt.show()

1668632527764.jpg

想看完整內容請去原文地址。
本文參考自: http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。