一直苦于沒有系統(tǒng)學(xué)習(xí)seanborn的教程,似乎市面上也還沒有完整的官方文檔的學(xué)習(xí)資料。終于下決心用幾天的時間通讀下官方文檔,并把記錄下來。
基于官方0.71版本,所有代碼和圖片皆已驗(yàn)證,與官方結(jié)論不符的地方會進(jìn)行標(biāo)注。如果有翻譯失當(dāng)或理解有誤的地方,敬請隨意指正!(http://seaborn.pydata.org/tutorial.html)
一個引人入勝的圖表非常重要,賞心悅目的圖形不但能讓數(shù)據(jù)探索中一些重要的細(xì)節(jié)更容易被挖掘,也能更有利于在與觀眾交流分析結(jié)果的過程中吸引觀眾的注意力并使觀眾們更容易記住結(jié)論。
Matplotlib無疑是高度可定制的,但快速實(shí)施出吸引人的細(xì)節(jié)就變得有些復(fù)雜。Seaborn作為一個帶著定制主題和高級界面控制的Matplotlib擴(kuò)展包,能讓繪圖變得更輕松,本部分主要介紹seaborn是如何對matplotlib輸出的外觀進(jìn)行控制的。
定義一個含偏移的正弦圖像,來比較傳統(tǒng)的matplotlib和seaborn的不同:
def sinplot(flip=1): x = np.linspace(0,14,100) for i in range(1,7): plt.plot(x,np.sin(x+i*.5)*(7-i)*flip)
使用matplotlib默認(rèn)設(shè)置的圖形效果:
import seaborn as snssinplot()
seaborn默認(rèn)的灰色網(wǎng)格底色靈感來源于matplotlib卻更加柔和。大多數(shù)情況下,圖應(yīng)優(yōu)于表。seaborn的默認(rèn)灰色網(wǎng)格底色避免了刺目的干擾,對于多個方面的圖形尤其有用,是一些更復(fù)雜的工具的核心。
Seaborn將matplotlib參數(shù)分成兩個獨(dú)立的組。第一組設(shè)定了美學(xué)風(fēng)格,第二組則是不同的度量元素,這樣就可以很容易地添加到代碼當(dāng)中了。
操作這些參數(shù)的接口是兩對函數(shù)。為了控制樣式,使用axesstyle()和setstyle()函數(shù)。為了擴(kuò)展繪圖,請使用plotting_context()和set_context()函數(shù)。在這兩種情況下,第一個函數(shù)返回一個參數(shù)字典,第二個函數(shù)則設(shè)置matplotlib默認(rèn)屬性。
有5個seaborn的主題,適用于不同的應(yīng)用和人群偏好:
darkgrid 黑色網(wǎng)格(默認(rèn))
whitegrid 白色網(wǎng)格
dark 黑色背景
white 白色背景
ticks 應(yīng)該是四周都有刻度線的白背景?
網(wǎng)格能夠幫助我們查找圖表中的定量信息,而灰色網(wǎng)格主題中的白線能避免影響數(shù)據(jù)的表現(xiàn),白色網(wǎng)格主題則類似的,當(dāng)然更適合表達(dá)“重數(shù)據(jù)元素”(heavy data elements不理解)
對于許多場景,(特別是對于像對話這樣的設(shè)置,您主要想使用圖形來提供數(shù)據(jù)模式的印象),網(wǎng)格就不那么必要了
sns.set_style('dark')sinplot()
有時你可能想要給情節(jié)增加一點(diǎn)額外的結(jié)構(gòu),這就是ticks參數(shù)的用途:
sns.set_style('ticks')sinplot()# 官方的例子在上方/右方也擁有刻度線,而驗(yàn)證時卻沒有(是jupyter notebook的原因?)
這里是官方運(yùn)行的結(jié)果,供參考:
特別的可以通過sns.axes_style(style=None, rc=None) 返回一個sns.set_style()可傳的參數(shù)的字典
通過類似sns.set_style('ticks', {'xtick.major.size': 8, 'ytick.major.size': 8})的方式寫入更具體的配置樣式。
關(guān)于sns.axes_style()下面會有說明和運(yùn)行結(jié)果
white和ticks參數(shù)的樣式,都可以刪除上方和右方坐標(biāo)軸上不需要的邊框,這在matplotlib中是無法通過參數(shù)實(shí)現(xiàn)的,卻可以在seaborn中通過despine()函數(shù)輕松移除他們。
一些圖的邊框可以通過數(shù)據(jù)移位,當(dāng)然調(diào)用despine()也能做同樣的事。當(dāng)邊框沒有覆蓋整個數(shù)據(jù)軸的范圍的時候,trim參數(shù)會限制留存的邊框范圍。
f, ax = plt.subplots()sns.violinplot(data=data)sns.despine(offset=10, trim=True); # offset 兩坐標(biāo)軸離開距離;
你也可以通過往despine()中添加參數(shù)去控制邊框
despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
從plot()函數(shù)中移除頂部或右邊的邊框
雖然來回切換非常容易,但sns也允許用with語句中套用axes_style()達(dá)到臨時設(shè)置參數(shù)的效果(僅對with塊內(nèi)的繪圖函數(shù)起作用)。這也允許創(chuàng)建不同風(fēng)格的坐標(biāo)軸。
with sns.axes_style('darkgrid'): plt.subplot(211) sinplot()plt.subplot(212)sinplot(-1)
如果您想要定制seanborn的樣式,可以將參數(shù)字典傳遞給axes_style()和set_style()的rc參數(shù)。注意,只能通過該方法覆蓋樣式定義的一部分參數(shù)。(然而,更高層次的set()函數(shù)接受任何matplotlib參數(shù)的字典)。
如果您想要查看包含哪些參數(shù),您可以只調(diào)用該函數(shù)而不帶參數(shù),這將返回當(dāng)前設(shè)置的字典:
或許,你可以試試不同種類的參數(shù)效果
sns.set_style('darkgrid', {'axes.facecolor': '.9'})sinplot()
另一組參數(shù)控制繪圖元素的規(guī)模,這應(yīng)該讓您使用相同的代碼來制作適合在較大或較小的情節(jié)適當(dāng)?shù)膱鼍爸惺褂玫那楣?jié)。
首先,可以通過sns.set()重置參數(shù)。
四種預(yù)設(shè),按相對尺寸的順序(線條越來越粗),分別是paper,notebook, talk, and poster。notebook的樣式是默認(rèn)的,上面的繪圖都是使用默認(rèn)的notebook預(yù)設(shè)。
sns.set_context('paper')plt.figure(figsize=(8,6))sinplot()
sns.set_context('talk')plt.figure(figsize=(8,6))sinplot()
通過觀察各種樣式的結(jié)果,你應(yīng)當(dāng)可以了解context函數(shù)
類似的,還可以使用其中一個名稱來調(diào)用set_context()來設(shè)置參數(shù),您可以通過提供參數(shù)值的字典來覆蓋參數(shù)。
通過更改context還可以獨(dú)立地擴(kuò)展字體元素的大小。(這個選項(xiàng)也可以通過頂級set()函數(shù)獲得)。
sns.set_context('notebook', font_scale=1.5, rc={'lines.linewidth': 2.5})sinplot()
類似地(盡管它可能用處不大),也可以使用with嵌套語句進(jìn)行臨時的設(shè)置。
樣式和上下文都可以用set()函數(shù)快速地進(jìn)行配置。這個函數(shù)還設(shè)置了默認(rèn)的顏色選項(xiàng),在下一節(jié)將詳細(xì)介紹這一功能。
聯(lián)系客服