我們前面講到 Python 的兩個科學計算庫,numpy 和 pandas,相信小伙伴們已經可以熟練使用這兩個庫中的常見方法。華羅庚老先生曾經說過這樣一句話,“數形結合百般好,數形分離萬事難”,圖形是我們科學計算的重要工具。在本篇我們將結合 numpy 和 pandas 包來給小伙伴們介紹一個非常好用的畫圖庫 matplotlib,matplotlib 非常適合進行交互式制圖,承接上兩篇,本篇繼續采用 jupyter notebook 進行演示。
首先,導入 pandas、numpy 和 matplotlib 包,結合 pandas 的 Series
函數生成一個角標從 0 到 999 的一維數組:
In [1]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
data.plot()
plt.show()
Out [1]:
同樣,我們也可以結合 pandas 中的 DataFrame
函數生成一個矩陣,并按照矩陣的列畫出 4 條線:
In [2]: data = pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),columns=list('ABCD'))
data = data.cumsum() # 累加
data.plot()
plt.show()
Out [2]:
接下來,我們將 A 作為 x 軸,將 B 作為 y 軸,畫出散點圖,觀察 A 與 B 是否有關系:
In [3]: data.plot.scatter(x='A',y='B',color='Red',label='Class 1')
plt.show()
Out [3]:
我們也可以用最簡單的方式,畫出一條折線,并修改一下線條的風格、顏色和標記:
In [4]: x = [1, 2, 3, 4]
y = [1, 2, 5, 7]
plt.plot(x, y, color="blue", linestyle="--", marker="*", linewidth=1.0)
plt.show()
Out [4]:
關于上文提到的線條的風格、顏色和標記的參照表,我們摘抄如下:
線條風格 | 實線 | 虛線 | 長虛線(上方代碼中使用的) | 點劃線 | 無線條(點) |
---|---|---|---|---|---|
代碼 | - | : | -- | -. | None(默認) |
線條顏色 | 紅色 | 黃色 | 綠色 | 藍色(上方代碼中使用的) | 黑色 | 白色 | 青色 |
---|---|---|---|---|---|---|---|
代碼 | r | y | g | b | k | w | c |
線條標記 | 代碼 | 線條標記 | 代碼 | 線條標記 | 代碼 | 線條標記 | 代碼 |
---|---|---|---|---|---|---|---|
圓圈 | o(小寫字母o) | 點 | . | 星號 | * | 加號 | + |
朝下三角 | v(小寫字母v) | 朝上三角 | ^ | 朝左三角 | < | 朝右三角 | > |
大菱形 | D | 小菱形 | d | 正方形 | s | 五邊形 | p |
為了讓圖更清晰易懂,我們可以再額外加上標題和標簽:
In [5]: x = np.arange(4)
y1 = np.exp(x)
y2 = np.exp(x*2)
plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1, label="y1")
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1, label="y2")
plt.title("Figure 1") # 聲明標題為 Figure 1
plt.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9)) # 在左上角 upper left 聲明標簽
plt.show()
Out [5]:
在某些情況下,我們也可以給圖添加網格和背景色,更有助于參照和對比數據:
In [6]: x = np.arange(4)
y1 = np.exp(x)
y2 = np.exp(x*2)
plt.subplot(facecolor="w") # 要先定義
plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1, label="y1")
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1, label="y2")
plt.title("Figure 1")
plt.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9))
plt.grid(color="k",linestyle=":")
plt.show()
Out [6]:
我們還可以更為詳細地用箭頭指向某條線,做詳細的注釋:
In [7]: x = np.arange(4)
y1 = np.exp(x)
y2 = np.exp(x*2)
plt.subplot(facecolor="w") # 要先定義
plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1, label="y1")
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1, label="y2")
plt.title("Figure 1")
plt.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9))
plt.grid(color="k",linestyle=":")
plt.annotate('y2 = np.exp(x*2)', xy=(2, 50), xytext=(1.5, 210), arrowprops=dict(facecolor='k', headwidth=5, width=1))
plt.show()
Out [7]:
annotate
的第一個參數 'y2 = np.exp(x*2)' 是注釋的文本信息,xy
表示要注釋的點的坐標,xytext
表示注釋文本的起始坐標,arrowprops
表示箭頭,facecolor
表示箭頭顏色,headwidth
表示箭頭寬度,width
表示箭身寬度。