seaborn是建立在matplotlib之上的圖像化module,如果你要使用matplotlib去製作一些精美細緻的圖片,需要了解非常多複雜的參數以及調整非常多的設定,seaborn針對美感上做了一些優化,提供使用者一些客製化的主題還有優美的使用介面。接下來透過seaborn的官方文檔去做一些有關圖表美化方法的細節介紹。
首先我們先import一些製作圖表會需要用到的工具:numpy, matplotlib.pyplot, seaborn
import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
接著,我們就直接進到圖表的部分,在官方文檔對於seaborn的介紹中定義了一個用sin函數做成的波浪圖,那下面呈現的圖片是完全沒有經過任何參數調整的default圖片
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) sinplot()
通常呢,我們會使用seaborn當中的seaborn.set()方法來做圖片格式的調整,使用這個方法就能夠直接更改圖片格式的設定;那這個方法有一些預設的參數設置,如果什麼參數都不加也可以使用,直接使用後的圖片會變成下面這個格式
sns.set()
sinplot()
我們可以很明顯發現圖片的底色變成淺灰色,線條的顏色也不那麼明亮,背景也多出了格子,那這邊給大家看一下這個方法預設的參數設定
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
那參數個別的意義這邊先不多做解釋,這樣子會直接牽扯到太細節的東西,如果有興趣的人可以到官方的文檔當中查看每個參數的意涵,
這邊簡單介紹一下接下來我們會用到的幾個function,如果你要用來控制樣式的話,我們會使用axes_style()以及set_style()這兩個functions;如果要做圖表內容的修改,譬如文字大小,圖表內容的粗細等等,我們會使用plotting_context()以及set_context()這兩個functions。
Seaborn圖表樣式
seaborn總共有五種預先設置好的主題:darkgrid, whitegrid, dark, white, ticks;使用者能夠依照自己的喜好及用途去做設置。那這邊seaborn預設的主題是darkgrid,剛才前面我們使用到的seaborn.set()當中,如果大家有仔細看的話會發現裡面的style參數是”darkgrid”,而這個grid的意思呢就是圖表當中的格線,這個格線能夠有助於使用者快速地查看圖表當中的數值型資料,那whitegrid這個主題跟darkgrid很相似,都有grid的輔助,那實際使用起來會是這個樣子
可以發現對於這種線條多的圖表並不是那麼適合,whitegrid通常比較適合用來呈現資料元素較多的圖表,譬如下面這張
sns.set_style(“whitegrid”)
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data);
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data);
當然,你也可以自由選擇要不要使用grid,如果不要使用grid的話使用seaborn.set_style()去更改主題,例如我下面使用的是dark主題
sns.set_style(“dark”)
sinplot()
sinplot()
前面我們提到,seaborn總共有預先為我們設置好5種樣式,其中darkgrid, dark, whitegrid, white在我們剛剛的介紹過後應該已經清楚許多,只差一個ticks樣式了,究竟它長什麼樣子呢?讓我們看下面的圖片
sns.set_style(“ticks”)
sinplot()
sinplot()
咦!?這不是跟white主題長一樣嗎?第一眼看過去你可能會有這樣的疑問,不過你可以再仔細看看這兩個主題有什麼差別?可以注意到在x軸及y軸座標的地方多了一條短短的線,輔助我們去做圖表上的位置核對
移除axes spines
如果你有仔細看的話,可以發現white及ticks這兩個主題的圖表不單單只是在左方以及下方的部分呈現y軸及x軸,他連右方及上方都幫你添加了y軸x軸,讓整個圖表看起來很像是被一個黑色的框框包住,當然有沒有必要這樣做取決於你,不過如果你想移除他的話,seaborn有提供一個方法-despine(),那我們用上一張ticks主題的圖表來處理,看看前後有什麼差異
sinplot()
sns.despine()
sns.despine()
有些圖表會需要透過縮減座標軸才能較完整地傳達圖表所想傳達的意思,縮減座標軸後會導致ticks(就是座標上方多出來短短的那一條線,ticks主題才會出現的那個)無法cover到整條座標軸,那我們這邊就可以用trim這個參數來縮減剩下座標軸的長度。
以下實例
before
#before
f, ax = plt.subplots()
sns.violinplot(data = data)
sns.despine()
f, ax = plt.subplots()
sns.violinplot(data = data)
sns.despine()
after(只調整offset)
f, ax = plt.subplots()
sns.violinplot(data = data)
sns.despine(offset = 10)
sns.violinplot(data = data)
sns.despine(offset = 10)
after(調整offset以及trim)
f, ax = plt.subplots()
sns.violinplot(data = data)
sns.despine(offset = 10, trim = True)
sns.violinplot(data = data)
sns.despine(offset = 10, trim = True)
當然你也可以自由調整要留下哪條座標軸,像下面這張圖,我們在despine() function當中加入了一個left參數,將left參數設置為true,就能夠隱藏左邊的這條座標軸
sns.set_style(“whitegrid”)
sns.boxplot(data = data, palette = “deep”)
sns.despine(left = True)
sns.boxplot(data = data, palette = “deep”)
sns.despine(left = True)
同時針對個別圖表做不同style的切換
我們前面使用的set_style()方法會直接地影響到後續所產生出來的圖表的樣式,所以假設我們需要在同一個block當中生產兩張或兩張以上的圖表,如果使用set_style()方法就沒辦法針對其中的圖表去設定不同的樣式,具體上怎麼樣針對在同一個block中的不同圖表設置不同的樣式呢?這邊我們會使用axes_style()方法搭配with statement去針對個別圖表短暫地設置其樣式,什麼叫做短暫地設置其樣式(英文直翻中文有點怪怪的),意思就是你不會去更動到set_style()裡面的設定,你現在所做的調整只是針對當前這張圖表去做設定,一旦設定完這張圖表跳到下一張圖表後,一樣是依照set_style()方法裡面所定義的圖表格式去做呈現
f = plt.figure()
with sns.axes_style(“darkgrid”):
ax = f.add_subplot(1, 2, 1)
sinplot()
ax = f.add_subplot(1, 2, 2)
sinplot()
with sns.axes_style(“darkgrid”):
ax = f.add_subplot(1, 2, 1)
sinplot()
ax = f.add_subplot(1, 2, 2)
sinplot()
可以看到一張圖的是darkgrid的主題,另一張則是我們先前設置set_style()的主題
seaborn樣式的覆蓋元素
如果你想要自行調整seaborn的樣式,你可以傳入一個dictionary的設定到axes_style()或是set_style()的rc參數中,但要記得,你只能覆蓋那些原來就在樣式定義當中的參數(如果你想要設定更多複雜的matplotlib參數,可以傳到set()方法當中);如果你想要看看到底有那些參數能夠調整,你可以直接傳入沒有參數的方法,他會回傳給你現在的設定
sns.axes_style()
{'axes.facecolor': 'white', 'axes.edgecolor': '.8', 'axes.grid': True, 'axes.axisbelow': True, 'axes.labelcolor': '.15', 'figure.facecolor': 'white', 'grid.color': '.8', 'grid.linestyle': '-', 'text.color': '.15', 'xtick.color': '.15', 'ytick.color': '.15', 'xtick.direction': 'out', 'ytick.direction': 'out', 'lines.solid_capstyle': 'round', 'patch.edgecolor': 'w', 'image.cmap': 'rocket', 'font.family': ['sans-serif'], 'font.sans-serif': ['Arial', 'DejaVu Sans', 'Liberation Sans', 'Bitstream Vera Sans', 'sans-serif'], 'patch.force_edgecolor': True, 'xtick.bottom': False, 'xtick.top': False, 'ytick.left': False, 'ytick.right': False, 'axes.spines.left': True, 'axes.spines.bottom': True, 'axes.spines.right': True, 'axes.spines.top': True}
譬如我們這邊想要使用darkgrid主題,但我們同時想修改這個主題的背景顏色
sns.set_style(“darkgrid”, {“axes.facecolor”: “.9”})
sinplot()
sinplot()
圖表元素的縮放
當然,這邊也有一些獨立的參數是讓你用來做圖表元素縮放上的調整與設定,讓你可以因應不同的需求去做調整,如果你不確定你前面到底用了什麼樣的style,你可以用set()去做回復到預設設定
sns.set()
前面有提到,seaborn預先為我們設置了5種主題,那這邊seaborn也預先為我們設置了4種內容大小:paper, notebook, talk, poster,我們只要把我們想使用的內容大小設定傳入set_context() function當中就可以了,例如以下是paper size的內容
sns.set_context(“paper”)
sinplot()
sinplot()
以下是talk size的內容
sns.set_context(“talk”)
sinplot()
sinplot()
以下是poster size的內容
sns.set_context(“poster”)
sinplot()
sinplot()
如同前面提到的,你可以自行調整這些設定,只要把你設定好的dictionary放到function當中的rc參數後面即可,例如
sns.set_context(“notebook”, font_scale=1.5, rc={“lines.linewidth”: 2.5})
sinplot()
sinplot()
注意,這些設定跟set_style()一樣是會影響到後續圖表的樣式,如果你想要針對個別圖表元素做不同的樣式設定的話,你也可以使用with statement搭配set_context() function去做暫時的設定