我們前面講到 Python 的兩個(gè)科學(xué)計(jì)算庫(kù),numpy 和 pandas,相信小伙伴們已經(jīng)可以熟練使用這兩個(gè)庫(kù)中的常見(jiàn)方法。華羅庚老先生曾經(jīng)說(shuō)過(guò)這樣一句話,“數(shù)形結(jié)合百般好,數(shù)形分離萬(wàn)事難”,圖形是我們科學(xué)計(jì)算的重要工具。在本篇我們將結(jié)合 numpy 和 pandas 包來(lái)給小伙伴們介紹一個(gè)非常好用的畫(huà)圖庫(kù) matplotlib,matplotlib 非常適合進(jìn)行交互式制圖,承接上兩篇,本篇繼續(xù)采用 jupyter notebook 進(jìn)行演示。
首先,導(dǎo)入 pandas、numpy 和 matplotlib 包,結(jié)合 pandas 的 Series 函數(shù)生成一個(gè)角標(biāo)從 0 到 999 的一維數(shù)組:
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]:

同樣,我們也可以結(jié)合 pandas 中的 DataFrame 函數(shù)生成一個(gè)矩陣,并按照矩陣的列畫(huà)出 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]:

接下來(lái),我們將 A 作為 x 軸,將 B 作為 y 軸,畫(huà)出散點(diǎn)圖,觀察 A 與 B 是否有關(guān)系:
In [3]: data.plot.scatter(x='A',y='B',color='Red',label='Class 1')
plt.show()
Out [3]:

我們也可以用最簡(jiǎn)單的方式,畫(huà)出一條折線,并修改一下線條的風(fēng)格、顏色和標(biāo)記:
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]:

關(guān)于上文提到的線條的風(fēng)格、顏色和標(biāo)記的參照表,我們摘抄如下:
| 線條風(fēng)格 | 實(shí)線 | 虛線 | 長(zhǎng)虛線(上方代碼中使用的) | 點(diǎn)劃線 | 無(wú)線條(點(diǎn)) |
|---|---|---|---|---|---|
| 代碼 | - | : | -- | -. | None(默認(rèn)) |
| 線條顏色 | 紅色 | 黃色 | 綠色 | 藍(lán)色(上方代碼中使用的) | 黑色 | 白色 | 青色 |
|---|---|---|---|---|---|---|---|
| 代碼 | r | y | g | b | k | w | c |
| 線條標(biāo)記 | 代碼 | 線條標(biāo)記 | 代碼 | 線條標(biāo)記 | 代碼 | 線條標(biāo)記 | 代碼 |
|---|---|---|---|---|---|---|---|
| 圓圈 | o(小寫(xiě)字母o) | 點(diǎn) | . | 星號(hào) | * | 加號(hào) | + |
| 朝下三角 | v(小寫(xiě)字母v) | 朝上三角 | ^ | 朝左三角 | < | 朝右三角 | > |
| 大菱形 | D | 小菱形 | d | 正方形 | s | 五邊形 | p |
為了讓圖更清晰易懂,我們可以再額外加上標(biāo)題和標(biāo)簽:
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") # 聲明標(biāo)題為 Figure 1
plt.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9)) # 在左上角 upper left 聲明標(biāo)簽
plt.show()
Out [5]:

在某些情況下,我們也可以給圖添加網(wǎng)格和背景色,更有助于參照和對(duì)比數(shù)據(jù):
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]:

我們還可以更為詳細(xì)地用箭頭指向某條線,做詳細(xì)的注釋?zhuān)?/p>
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 的第一個(gè)參數(shù) 'y2 = np.exp(x*2)' 是注釋的文本信息,xy 表示要注釋的點(diǎn)的坐標(biāo),xytext 表示注釋文本的起始坐標(biāo),arrowprops 表示箭頭,facecolor 表示箭頭顏色,headwidth 表示箭頭寬度,width 表示箭身寬度。