Python數據處理從零開始----第四章(可視化)背景:Matplotlib

背景:

我們現在將深入研究Matplotlib包,以便在Python中進行可視化。 Matplotlib是一個基於NumPy陣列的多平臺數據可視化庫,旨在與更廣泛的SciPy協同工作。它由John Hunter在2002年構思,最初是作爲IPython的補丁,用於通過來自IPython命令行的gnuplot實現交互式MATLAB風格的繪圖。 IPython的創始人Fernando Perez當時正完成他的博士學位,而約翰知道他幾個月沒時間補丁了。約翰認爲這是他自己開始的一個提示,Matplotlib軟件包誕生了,2003年發佈了0.1版本。當它被作爲太空望遠鏡科學研究所選擇的繪圖包時,它得到了早期的提升。哈勃望遠鏡背後的科學家在財務上支持Matplotlib的開發並大大擴展了其功能。

Matplotlib最重要的功能之一是它能夠很好地兼容許多操作系統和圖形後端。 Matplotlib支持許多後端和輸出類型,這意味着無論您使用哪種操作系統或您希望使用哪種輸出格式,您都可以依賴它。這種跨平臺,一切對每個人的方法都是Matplotlib的強大優勢之一。它帶來了龐大的用戶羣,這反過來又導致了活躍的開發人員基礎和Matplotlib在科學Python世界中的強大工具和普遍性。

然而,近年來,Matplotlib的界面和風格已經開始顯示它們的年齡。 R語言中的ggplot和ggvis等新工具,以及基於D3js和HTML5畫布的Web可視化工具包,經常使Matplotlib感覺笨重和老式。儘管如此,我認爲我們不能忽視Matplotlib作爲經過良好測試的跨平臺圖形引擎的優勢。最近的Matplotlib版本使得設置新的全局繪圖樣式變得相對容易(請參閱自定義Matplotlib:配置和樣式表),人們一直在開發基於其強大內部構建的新軟件包,通過更清晰,更現代的API來驅動Matplotlib,例如, Seaborn(可視化與Seaborn討論),ggpy,HoloViews,Altair,甚至Pandas本身都可以用作Matplotlib API的包裝。即使使用這樣的包裝器,通常也可以深入研究Matplotlib的語法來調整最終的繪圖輸出。出於這個原因,我相信Matplotlib本身仍將是數據可視化堆棧的重要組成部分,即使新工具意味着社區逐漸不再使用Matplotlib API。

Matplotlib

一般Matplotlib技巧

在我們深入瞭解使用Matplotlib創建可視化的細節之前,您應該瞭解一些有關使用該軟件包的有用信息。 1.導入Matplotlib 就像我們使用np簡寫爲NumPy和pandas的pd簡寫一樣,我們將使用Matplotlib導入的一些標準shorthands:

import matplotlib as mpl
import matplotlib.pyplot as plt

我們將matplotlib導入爲mpl,將matplotlib.pyplot導入爲plt 而plt接口是我們最常使用的接口。

設置樣式

我們將使用plt.style指令爲我們的數字選擇合適的美學風格。在這裏,我們將設置經典樣式,確保我們創建的圖使用經典的Matplotlib樣式:

plt.style.use( 'classic')

我們可以根據自己需求調整樣式。

如何顯示我們畫的圖

Matplotlib大概三個常用的編譯環境,分別是腳本,IPython終端或IPython筆記本中使用Matplotlib。

  • 從腳本繪圖 如果您在腳本中使用Matplotlib,則函數plt.show()並打開一個或多個顯示您的圖形或圖形的交互式窗口。有一點需要注意:plt.show()命令每個Python會話只能使用一次,最常見於腳本的最後。
  • 從IPython shell繪圖 在IPython shell中以交互方式使用Matplotlib非常方便(參見IPython:Beyond Normal Python)。如果指定Matplotlib模式,IPython可以很好地與Matplotlib一起使用。要啓用此模式,可以在啓動ipython後使用%matplotlib magic命令:
  • 從IPython筆記本繪圖 IPython筆記本是一種基於瀏覽器的交互式數據分析工具,可以將敘述,代碼,圖形,HTML元素等組合到一個可執行文檔中(參見IPython:Beyond Normal Python)。可以使用%matplotlib命令在IPython筆記本中以交互方式繪製,並以與IPython shell類似的方式工作。%matplotlib inline 筆記本將導致嵌入在筆記本中的交互式圖
import matplotlib.pyplot as plt

import numpy as np
x = np.linspace(0, 10, 100)

fig = plt.figure()
plt.plot(x, np.sin(x), '-')
plt.plot(x, np.cos(x), '--');

保存已經畫好的圖片

Matplotlib的一個很好的功能是能夠以各種格式保存數字。 可以使用savefig()命令保存圖形。 例如,要將上一個圖保存爲PDF文件,可以運行以下命令:

fig.savefig('my_figure.pdf')

使用一下命令確認該圖已經保存

# In[*]
fig.savefig('my_figure.jpeg')
from IPython.display import Image
Image('my_figure.jpeg')

在savefig()中,文件格式是從給定文件名的擴展名推斷出來的。 根據您安裝的後端,可以使用許多不同的文件格式。 通過使用圖形畫布對象的以下方法,可以爲系統找到支持的文件類型列表:

fig.canvas.get_supported_filetypes()
Out[12]: 
{'ps': 'Postscript',
 'eps': 'Encapsulated Postscript',
 'pdf': 'Portable Document Format',
 'pgf': 'PGF code for LaTeX',
 'png': 'Portable Network Graphics',
 'raw': 'Raw RGBA bitmap',
 'rgba': 'Raw RGBA bitmap',
 'svg': 'Scalable Vector Graphics',
 'svgz': 'Scalable Vector Graphics',
 'jpg': 'Joint Photographic Experts Group',
 'jpeg': 'Joint Photographic Experts Group',
 'tif': 'Tagged Image File Format',
 'tiff': 'Tagged Image File Format'}

Matplotlib的兩個接口

Matplotlib的一個可能令人困惑的特性是它的雙重接口:一個方便的

MATLAB風格的基於狀態的接口,以及一個更強大的面向對象的接口。

MATLAB風格的基於狀態的接口

Matplotlib最初是作爲MATLAB用戶的Python替代編寫的,其大部分語法都反映了這一事實。 MATLAB風格的工具包含在pyplot(plt)界面中。 例如,以下代碼可能對MATLAB用戶來說非常熟悉:

plt.figure()  #創建圖形

# 設置雙圖的第一個圖
plt.subplot(2, 1, 1) # (rows, columns, panel number)
plt.plot(x, np.sin(x))

# 設置雙圖的第二個圖
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x));

這種接口最重要的特點是有狀態的,它會跟蹤‘當前的’圖片和座標軸,可以使用plt.gcf()和plt.gca()獲取當前圖片和座標軸。這樣帶來的問題就是當我們畫第二個圖時,怎麼回到第一個子圖並增加新內容呢?

面向對象的接口

fig, ax = plt.subplots(2)

# Call plot() method on the appropriate object
ax[0].plot(x, np.sin(x))
ax[1].plot(x, np.cos(x));

一般而言選擇使用哪種樣式在取決於偏好,但是當面對比較複雜的圖時,應該選擇ax.plot()。在大多數情況下,將plt.plot()切換到ax.plot()差別很小,但是我們將在下面的部分中提出一些問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章