8.4 簡單的折線圖
譯者:飛龍
本節是《Python 數據科學手冊》(Python Data Science Handbook)的摘錄。
也許最簡單的繪圖是單個函數y = f(x)
的可視化。在這里,我們將首先看一下這種類型的簡單繪圖。與以下所有部分一樣,我們首先為繪圖配置筆記本,并導入我們將使用的包:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
對于所有 Matplotlib 繪圖,我們首先創建一個圖形和一個軸域。在最簡單的形式中,可以按如下方式創建圖形和軸域:
fig = plt.figure()
ax = plt.axes()
在Matplotlib中,圖形(plt.Figure
類的實例)可以視為單個容器,包含代表軸域,圖形,文本和標簽的所有對象。軸域(plt.Axes
類的實例)就是我們在上面看到的:帶有刻度和標簽的邊界框,它最終將包含構成我們可視化的繪圖元素。在本書中,我們通常使用變量名fig
來引用圖形實例,而ax
來引用一個或一組軸域實例。
一旦我們創建了軸域,我們就可以使用ax.plot
函數來繪制一些數據。 讓我們從一個簡單的正弦曲線開始:
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x));
或者,我們可以使用pylab
接口,讓我們在后臺創建圖形和軸域
(參見“一個功能的兩個接口”,那里討論了這兩個接口):
plt.plot(x, np.sin(x));
如果我們想要創建一個包含多條直線的單個圖形,我們可以簡單地多次調用plot
函數:
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x));
這就是在 Matplotlib 中繪制簡單函數的全部內容!我們現在將深入探討,如何控制軸域和線條的外觀的更多細節。
調整繪圖:線條顏色和樣式
你可能希望對繪圖進行的第一個調整,是控制線條顏色和樣式。plt.plot()
函數接受可用于指定這些的其他參數。要調整顏色,可以使用color
關鍵字,該關鍵字接受字符串參數,表示幾乎任何可以想象的顏色。顏色可以通過多種方式指定:
plt.plot(x, np.sin(x - 0), color='blue') # 根據名稱指定顏色
plt.plot(x, np.sin(x - 1), color='g') # 短顏色代碼(rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75') # 0~1 的灰度
plt.plot(x, np.sin(x - 3), color='#FFDD44') # 十六進制代碼(00~FF 的 RRGGBB)
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # RGB 元組,值為 0~1
plt.plot(x, np.sin(x - 5), color='chartreuse'); # 支持所有 HTML 顏色名
如果未指定顏色,Matplotlib 將自動遍歷一組默認顏色,來顯示多個線條。
同樣,可以使用linestyle
關鍵字調整線條樣式:
plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted');
# 簡短起見,你可以使用下面的代碼
plt.plot(x, x + 4, linestyle='-') # 實線
plt.plot(x, x + 5, linestyle='--') # 虛線
plt.plot(x, x + 6, linestyle='-.') # 點虛線
plt.plot(x, x + 7, linestyle=':'); # 點線
如果你想非常簡潔,這些linestyle
和color
代碼可以合并為plt.plot()
函數的一個非關鍵字參數:
plt.plot(x, x + 0, '-g') # 綠色實線
plt.plot(x, x + 1, '--c') # 青色虛線
plt.plot(x, x + 2, '-.k') # 黑色點虛線
plt.plot(x, x + 3, ':r'); # 紅色點線
這些單字符顏色代碼反映了 RGB(紅色/綠色/藍色)和 CMYK(青色/品紅色/黃色/黑色)顏色系統中的標準縮寫,通常用于數字彩色圖形。
還有許多其他關鍵字參數可用于微調圖的外觀; 對于更多詳細信息,我建議使用 IPython 的幫助工具查看plt.plot()
函數的文檔字符串(參見“IPython 中的幫助和文檔”)。
調整繪圖:軸域限制
在為你的繪圖選擇默認軸域限制方面,Matplotlib 做得不錯,但有時候手動控制會更好。調整軸域限制的最基本方法是使用plt.xlim()
和plt.ylim()
方法:
plt.plot(x, np.sin(x))
plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5);
如果由于某種原因你想要反向顯示任一軸,你可以簡單地顛倒參數的順序:
plt.plot(x, np.sin(x))
plt.xlim(10, 0)
plt.ylim(1.2, -1.2);
一個有用的相關方法是plt.axis()
(注意這里axes
(復數形式)與axis
(單數形式)之間可能存在混淆,前者帶有e
而后者帶有i
)。plt.axis()
方法允許你通過一次調用來設置x
和y
限制,通過一個指定[xmin, xmax, ymin, ymax]
的列表:
注:在本書中,如果
axes
指代兩個軸圍成的區域,一律翻譯為“軸域”。
plt.plot(x, np.sin(x))
plt.axis([-1, 11, -1.5, 1.5]);
plt.axis()
方法甚至超出了這個范圍,允許你做一些事情,比如自動收緊當前繪圖周圍的邊界:
plt.plot(x, np.sin(x))
plt.axis('tight');
它允許你做更高級別的規定,例如確保相等的寬高比,以便在屏幕上,x
中的一個單位等于y
中的一個單位:
plt.plot(x, np.sin(x))
plt.axis('equal');
對于軸域限制和plt.axis
方法的其他功能的更多信息,請參閱plt.axis
文檔字符串。
標注繪圖
作為本節的最后一部分,我們將簡要介紹圖表的標簽:標題,軸標簽和簡單圖例。標題和軸標簽是最簡單的標簽 - 有一些方法可用于快速設置它們:
plt.plot(x, np.sin(x))
plt.title("A Sine Curve")
plt.xlabel("x")
plt.ylabel("sin(x)");
可以使用函數的可選參數調整這些標簽的位置,大小和樣式。更多信息請參閱 Matplotlib 文檔以及每個函數的文檔字符串。
當在單個軸中顯示多條線時,創建標記每種線條類型的圖例是很有用的。同樣,Matplotlib 有一種內置方式,用于快速創建這樣的圖例。它是通過(你猜對了)plt.legend()
方法完成的。雖然有幾種有效的方法可以使用它,但我發現使用plot
函數的label
關鍵字,指定每行的標簽是最簡單的:
plt.plot(x, np.sin(x), '-g', label='sin(x)')
plt.plot(x, np.cos(x), ':b', label='cos(x)')
plt.axis('equal')
plt.legend();
你可以看到,plt.legend()
函數跟蹤線條樣式和顏色,并將它們匹配正確的標簽。指定和格式化圖形圖例的更多信息,可以在plt.legend
的文檔字符串中找到;此外,我們將在“自定義圖例”中,介紹一些更高級的圖例選項。
旁注:Matplotlib 的陷阱
雖然大多數plt
函數可以直接轉換為ax
方法(例如plt.plot()
→ax.plot()
,plt.legend()
→ ax.legend()
等等,不是所有命令都是這種情況。特別是,設置限制,標簽和標題的函數是稍微改動的。要在 MATLAB 風格函數和面向對象方法之間轉換,請更改以下東西:
-
plt.xlabel()
→ax.set_xlabel()
-
plt.ylabel()
→ax.set_ylabel()
-
plt.xlim()
→ax.set_xlim()
-
plt.ylim()
→ax.set_ylim()
-
plt.title()
→ax.set_title()
在面向對象的繪圖接口中,并不單獨調用這些函數,而是使用ax.set()
方法一次設置所有這些屬性,通常更方便:
ax = plt.axes()
ax.plot(x, np.sin(x))
ax.set(xlim=(0, 10), ylim=(-2, 2),
xlabel='x', ylabel='sin(x)',
title='A Simple Plot');