學(xué)習(xí)本章代碼案例的最簡單方法是在Jupyter notebook進行交互式繪圖。在Jupyter notebook中執(zhí)行下面的語句:
%matplotlib notebook
#%matplotlib inline是jupyter notebook里的命令, 意思是將那些用matplotlib繪制的圖顯示在頁面里而不是彈出一個窗口。
9.1 matplotlib API入門
matplotlib的通常引入約定是:
In [11]: import matplotlib.pyplot as plt
在Jupyter中運行%matplotlib notebook(或在IPython中運行%matplotlib),就可以創(chuàng)建一個簡單的圖形。如果一切設(shè)置正確,會看到圖9-1:
In [12]: import numpy as np
In [13]: data = np.arange(10)
In [14]: data
Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [15]: plt.plot(data)

Figure和Subplot
matplotlib的圖像都位于Figure對象中。你可以用plt.figure創(chuàng)建一個新的Figure:
In [16]: fig = plt.figure()
如果用的是IPython,這時會彈出一個空窗口,但在Jupyter中,必須再輸入更多命令才能看到。plt.figure有一些選項,特別是figsize,它用于確保當(dāng)圖片保存到磁盤時具有一定的大小和縱橫比。
不能通過空Figure繪圖。必須用add_subplot創(chuàng)建一個或多個subplot才行:
In [17]: ax1 = fig.add_subplot(2, 2, 1)
這條代碼的意思是:圖像應(yīng)該是2×2的(即最多4張圖),且當(dāng)前選中的是4個subplot中的第一個(編號從1開始)。如果再把后面兩個subplot也創(chuàng)建出來,最終得到的圖像如圖9-2所示:
In [18]: ax2 = fig.add_subplot(2, 2, 2)
In [19]: ax3 = fig.add_subplot(2, 2, 3)

下面出現(xiàn)交互式界面后,不要關(guān)閉,運行之后的命令,可以看到最后一副圖中出現(xiàn)了線
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
如果這時執(zhí)行一條繪圖命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就會在最后一個用過的subplot(如果沒有則創(chuàng)建一個)上進行繪制,隱藏創(chuàng)建figure和subplot的過程。因此,如果我們執(zhí)行下列命令,你就會得到如圖9-3所示的結(jié)果:
In [20]: plt.plot(np.random.randn(50).cumsum(), 'k--')
"k--"是一個線型選項,用于告訴matplotlib繪制黑色虛線圖。上面那些由fig.add_subplot所返回的對象是AxesSubplot對象,直接調(diào)用它們的實例方法就可以在其它空著的格子里面畫圖了.其他兩個圖也可以畫:
In [21]: ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
In [22]: ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

其他調(diào)整操作就不一一列舉了。
將圖表保存到文件
利用plt.savefig可以將當(dāng)前圖表保存到文件。該方法相當(dāng)于Figure對象的實例方法savefig。例如,要將圖表保存為SVG文件,你只需輸入:
plt.savefig('figpath.svg')
文件類型是通過文件擴展名推斷出來的。因此,如果你使用的是.pdf,就會得到一個PDF文件。我在發(fā)布圖片時最常用到兩個重要的選項是dpi(控制“每英寸點數(shù)”分辨率)和bbox_inches(可以剪除當(dāng)前圖表周圍的空白部分)。要得到一張帶有最小白邊且分辨率為400DPI的PNG圖片,你可以:
plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
savefig并非一定要寫入磁盤,也可以寫入任何文件型的對象,比如BytesIO:
from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
表9-2列出了savefig的其它選項。

9.2 使用pandas和seaborn繪圖
matplotlib實際上是一種比較低級的工具。要繪制一張圖表,你組裝一些基本組件就行:數(shù)據(jù)展示(即圖表類型:線型圖、柱狀圖、盒形圖、散布圖、等值線圖等)、圖例、標(biāo)題、刻度標(biāo)簽以及其他注解型信息。
在pandas中,我們有多列數(shù)據(jù),還有行和列標(biāo)簽。pandas自身就有內(nèi)置的方法,用于簡化從DataFrame和Series繪制圖形。另一個庫seaborn(https://seaborn.pydata.org/),由Michael Waskom創(chuàng)建的靜態(tài)圖形庫。Seaborn簡化了許多常見可視類型的創(chuàng)建。
提示:引入seaborn會修改matplotlib默認的顏色方案和繪圖類型,以提高可讀性和美觀度。即使你不使用seaborn API,你可能也會引入seaborn,作為提高美觀度和繪制常見matplotlib圖形的簡化方法。
Series和DataFrame都有一個用于生成各類圖表的plot方法。默認情況下,它們所生成的是線型圖.
In [60]: s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
In [61]: s.plot()

其他柱狀圖或者散點圖就不一一介紹了
對于在繪制一個圖形之前,需要進行合計的數(shù)據(jù),使用seaborn可以減少工作量。seaborn.barplot有顏色選項,使我們能夠通過一個額外的值設(shè)置.