幾周前,R語言社區(qū)經(jīng)歷了一場關(guān)于畫圖工具的討論。對于我們這種外人來說,具體的細(xì)節(jié)并不重要,但是我們可以將一些有用的觀點(diǎn)運(yùn)用到 Python 中。討論的重點(diǎn)是 R 語言自帶的繪圖工具 base R 和 Hadley Wickham 開發(fā)的繪圖工具 ggplot2 之間的優(yōu)劣情況。如果你想了解更多細(xì)節(jié)內(nèi)容,請閱讀以下幾篇文章:
- http://simplystatistics.org/2016/02/11/why-i-dont-use-ggplot2/
- http://varianceexplained.org/r/why-I-use-ggplot2/
- http://flowingdata.com/2016/03/22/comparing-ggplot2-and-r-base-graphics/
其中最重要的兩個(gè)內(nèi)容是:
- 其中一個(gè)工具能夠?qū)崿F(xiàn)的功能另一個(gè)工具也同樣能實(shí)現(xiàn)。
- ggplot2 非常適合用于探索性分析。
不是所有人都認(rèn)同第二個(gè)觀點(diǎn),ggplot2確實(shí)無法繪制出所有的圖表類型,但是我會利用它來做分析。
綜述
以下是 2016 年 4 月寫的關(guān)于繪圖工具的概述。出于多方面的原因,繪圖工具的選取更多地取決于個(gè)人偏好,因此本文介紹的 Python 繪圖工具也僅代表我的個(gè)人使用偏好。
Matplotlib
Matplotlib 是一個(gè)強(qiáng)大的工具,它是 Pandas' builtin-plotting 和 Seaborn 的基礎(chǔ)。Matplotlib 能夠繪制許多不同的圖形,還能調(diào)用多個(gè)級別的許多 API。我發(fā)現(xiàn)pyplot api非常好用,你可能用不上Transforms 或者 artists,但是如果你有需求的話可以查閱幫助文檔。我將從 pandas 和 seaborn 圖開始介紹,然后介紹如何調(diào)用 pyplot 的API。
Pandas' builtin-plotting
DataFrame 和 Series 擁有 .plot 的命名空間,其中有許多圖形類別可供選擇(line, hist, scatter, 等等)。 Pandas 對象還提供了額外的用于增強(qiáng)圖形展現(xiàn)效果的數(shù)據(jù),如索引變量。
由于 pandas 具有更少的向后兼容的限制,所以它具有更好的美學(xué)特性。從這方面來說,我認(rèn)為 pandas 中的 DataFrame.plot 是一個(gè)非常實(shí)用的快速探索性分析的工具。
Seaborn
Michael Waskom 所開發(fā)的 Seaborn 提供了一個(gè)高層次的界面來繪制更吸引人統(tǒng)計(jì)圖形。Seaborn 提供了一個(gè)可以快速探索分析數(shù)據(jù)不同特征的 API 接口,接下來我們將重點(diǎn)介紹它。
Bokeh
Bokeh 是一款針對瀏覽器開發(fā)的可視化工具。
和 matplotlib 一樣,**Bokeh
** 擁有一系列 API 接口。比如 glpyhs 接口,該接口和 matplotllib 中的 Artists 接口非常相似,它主要用于繪制環(huán)形圖、方形圖和多邊形圖等。最近 Bokeh 又開放了一個(gè)新的圖形接口,該接口主要用于處理詞典數(shù)據(jù)或 DataFrame 數(shù)據(jù),并用于繪制罐頭圖。
其他工具:
以下是一些本文沒有提到的可視化工具:
- Lightning
- HoloViews
- Glueviz
- vispy
- bqplot
案例介紹
我們將利用 ggplot2 中的 diamonds 數(shù)據(jù)集,你可以在 Vincent Arelbundock's RDatasets 中找到它(pd.read_csv('http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv')),此外我們還需要檢測是否已經(jīng)安裝feather。



[站外圖片上傳中……(4)]
Bokeh 提供了兩個(gè) API,一個(gè)是低級的 glyph API,另一個(gè)是高級的 Charts API。
[站外圖片上傳中……(5)]
還不是很清楚我們應(yīng)該在啥時(shí)候利用 Bokeh 來進(jìn)行探索性分析,不過它的交互式功能可以激發(fā)我的興趣。就個(gè)人而言,由于習(xí)慣問題我平時(shí)仍然一直使用 matplotlib 來繪圖,我還無法完全切換到 Bokeh 中。
我非常喜歡 Bokeh 的儀表盤功能和 bokeh server 的 webapps。
[站外圖片上傳中……(6)]
Matplotlib
[站外圖片上傳中……(7)]
[站外圖片上傳中……(8)]
matplotlib 并不局限于處理 DataFrame 數(shù)據(jù),它支持所有使用 getitem 作為鍵值的數(shù)據(jù)類型。
[站外圖片上傳中……(9)]
[站外圖片上傳中……(10)]
我們從列變量的名字中提取出軸標(biāo)簽,利用 Pandas 可以更加便捷地繪制一系列共享 x 軸數(shù)據(jù)的圖形。
[站外圖片上傳中……(11)]
[站外圖片上傳中……(12)]
Seaborn
本文中的剩余部分將重點(diǎn)介紹 seaborn和為什么我認(rèn)為它是探索性分析的強(qiáng)大工具。
我強(qiáng)烈建議你閱讀 Seaborn 的 introductory notes,這上面介紹了 seaborn 的設(shè)計(jì)邏輯和應(yīng)用領(lǐng)域。
Seaborn 主要目的是將探索和理解數(shù)據(jù)核心部分的過程進(jìn)行可視化處理。
我們可以通過一個(gè)穩(wěn)定的且易懂的 API 接口來調(diào)用 Seaborn。
繪圖函數(shù)通過調(diào)用盡量少的參數(shù)來實(shí)現(xiàn)可視化的過程,此外還可以通過修改附加參數(shù)的形式來自定義選項(xiàng)。
事實(shí)上,seaborn 是基于 matplotlib 開發(fā)的,這意味著如果你熟悉 pyplot API的話,那么你可以很容易地掌握 seaborn。
大多數(shù) seaborn 繪圖函數(shù)的參數(shù)都由 x, y, hue, 和 data 構(gòu)成(并不是所有的參數(shù)都是必須的)。如果你處理的對象是 DataFrame,那么你可以直接將列變量的名稱和數(shù)據(jù)集的名稱一同傳遞到繪圖函數(shù)中。
[站外圖片上傳中……(13)]
[站外圖片上傳中……(14)]
[站外圖片上傳中……(15)]
[站外圖片上傳中……(16)]
我們可以很輕易地探究兩個(gè)變量之間的關(guān)系:
[站外圖片上傳中……(17)]
[站外圖片上傳中……(18)]
或者一次探究多個(gè)變量之間的關(guān)系:
[站外圖片上傳中……(19)]
[站外圖片上傳中……(20)]
pariplot 是 PairGrid 的一個(gè)包裝函數(shù),它提供了 seaborn 一個(gè)重要的抽象功能——Grid。Seaborn 的 Grid 將 matplotlib 中Figure 和數(shù)據(jù)集中的變量聯(lián)系起來了。
我們有兩種方式可以和 grids 進(jìn)行交互操作。其一,seaborn 提供了類似于 pairplot 的包裝函數(shù),它提前設(shè)置了許多常見任務(wù)的參數(shù);其二,如果你需要更多的自定義選項(xiàng),那么你可以直接利用 Grid 方法。
[站外圖片上傳中……(21)]
[站外圖片上傳中……(22)]
[站外圖片上傳中……(23)]
34312 rows × 7 columns
[站外圖片上傳中……(24)]
[站外圖片上傳中……(25)]
FaceGrid 可以通過控制分面變量來生成 Grid圖形,其中PairGrid是它的一個(gè)特例。接下來的案例中,我們將以數(shù)據(jù)集中的 cut 變量為分面變量來繪制圖像:
[站外圖片上傳中……(26)]
[站外圖片上傳中……(27)]
最后一個(gè)案例展示了如何將 seaborn 和 matplotlib 結(jié)合起來。g.axes是matplotlib.Axes的一個(gè)數(shù)組,g.fig是matplotlib.Figure的一個(gè)特例。這是使用 seaborn 時(shí)常見的一個(gè)模式:利用 seaborn 的方法來繪制圖像,然后再利用 matplotlib 來調(diào)整細(xì)節(jié)部分。
我認(rèn)為 seaborn 之所以吸引人是因?yàn)樗睦L圖語法具有很強(qiáng)的靈活性。你不會被作者所設(shè)定的圖表類型所局限住,你可以根據(jù)自己的需要創(chuàng)建新的圖表。
[站外圖片上傳中……(28)]
[站外圖片上傳中……(29)]
[站外圖片上傳中……(30)]
[站外圖片上傳中……(31)]
本來,我打算準(zhǔn)備更多的例子來介紹 seaborn,但是我會將相關(guān)鏈接分享給大家。Seaborn 的說明文檔寫的非常詳細(xì)。
最后,我們將結(jié)合 scikit-learn 來介紹如何利用 GridSearch 來尋找最佳參數(shù)。
[站外圖片上傳中……(32)]
[站外圖片上傳中……(33)]
[站外圖片上傳中……(34)]
原文鏈接:http://tomaugspurger.github.io/modern-6-visualization.html
原文作者:Tom Augspurger
譯者:Fibears