2022年7月16日 星期六

Python 學習筆記 : Seaborn 資料視覺化 (一)

最近參加公司的資料視覺化內訓, 從課堂中學到了 Matplotlib 的進階美圖豪華版套件 Seaborn, 想說趁著記憶猶新, 先起個頭整理一下程式安裝與初體驗的筆記, 等有空再慢慢把每一種統計圖都測試一下. 其實要啃完 Seaborn 需要花不少時間, 因為它支援的統計圖形大部分我以前都沒用過 (其實是連聽都沒聽過). 

Seaborn 是建立在 Matplotlib 上的高階資料視覺化套件, 它跟 Pandas 裡的繪圖功能一樣都是 Matplotlib 的再封裝函式庫 (wrapper), 由於它提供了預設的主題佈景, 使得所繪製的圖形較美觀 (這些美學效果若使用 Matplotlib 來做需設定較多參數). 但是 Seanborn 並不是要取代 Matplotlib, 而是用來擴充其功能, 使用時也要同時匯入 Matplotlib, 顯示圖形仍然是呼叫 plt.show() 函式.  

Seaborn 的特點歸納如下 : 
  • 提供線上資料集, 可直接載入進行測試或學習. 
  • 提供預設主題佈景, 可輕鬆繪製漂亮的圖表, 不必像 Matplotlib 那樣傳入一大堆參數. 
  • 具有客製化的調色盤, 可彈性地設定圖形的色彩配置. 
  • 與 Pandas 的 DataFrame 高度結合, 可將 Pandas 資料直接與顏色, 大小, 或樣式對應, 大幅地簡化程式碼. 
  • 資料格式較多元, 可用 list, ndarray, 與 DataFrame (用 data 參數) 作為資料源.
  • 可從多面向呈現資料的分布, 滿足探索性資料分析的各種需要. 
  • 同時支援低階的軸等級 (axes-level) 與高階的畫布等級 (figure-level) 繪圖函式, 其中以畫布等級函式較常用, 因它與 DataFrame 緊密結合, 可直接依據資料分類自動繪製成子圖, 毋須自行處理子圖. 
Matplotlab 的發展比 Pandas 要早了 10 年, 它使用 Numpy 的 ndarray 作為資料結構來繪圖, 缺乏對 Pandas 的 DataFrame 之支援, 而 Seaborn 的主要目的就是要補足這一塊. 其次是 Seaborn 提供預設主題佈景, 使用預設的樣式與色彩就能輕易繪製出更吸睛的圖形, 特別是統計分析圖表. 不過 Matplotlib 後來也新增了 plt.style 子模組來增強它在樣式風格方面的不足, 參考 : 


Seaborn 教學文件參考 :


參考書目 :
  1. Python 網路爬蟲與資料視覺化 (旗標, 2017, 陳允傑) 第 14 章
  2. Python 資料可視化之美 (深智, 2020, 張傑) 第 3 章
  3. Python 資料科學手冊 (碁峰, 2017, 何敏煌譯) 第 4 章
  4. Python資料可視化攻略 (碁峰, 2021)
  5. Pandas 資料清理, 重塑, 過濾, 視覺化 (旗標, 2021) 第 12 章
一. 安裝 Seaborn 套件 : 

首先用 pip install seaborn 安裝套件, 若之前已安裝過, 可在後面加 -U 更新 : 

C:\Users\User>pip install seaborn -U   
Requirement already satisfied: seaborn in c:\python37\lib\site-packages (0.11.0)
Collecting seaborn
  Downloading seaborn-0.11.2-py3-none-any.whl (292 kB)
     ---------------------------------------- 292.8/292.8 kB 1.1 MB/s eta 0:00:00
Requirement already satisfied: numpy>=1.15 in c:\python37\lib\site-packages (from seaborn) (1.19.4)
Requirement already satisfied: scipy>=1.0 in c:\python37\lib\site-packages (from seaborn) (1.4.1)
Requirement already satisfied: matplotlib>=2.2 in c:\python37\lib\site-packages (from seaborn) (3.2.1)
Requirement already satisfied: pandas>=0.23 in c:\python37\lib\site-packages (from seaborn) (1.2.5)
Requirement already satisfied: cycler>=0.10 in c:\python37\lib\site-packages (from matplotlib>=2.2->seaborn) (0.10.0)
Requirement already satisfied: python-dateutil>=2.1 in c:\python37\lib\site-packages (from matplotlib>=2.2->seaborn) (2.7.5)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\python37\lib\site-packages (from matplotlib>=2.2->seaborn) (1.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\python37\lib\site-packages (from matplotlib>=2.2->seaborn) (2.3.1)
Requirement already satisfied: pytz>=2017.3 in c:\python37\lib\site-packages (from pandas>=0.23->seaborn) (2018.9)
Requirement already satisfied: six in c:\python37\lib\site-packages (from cycler>=0.10->matplotlib>=2.2->seaborn) (1.12.0)
Requirement already satisfied: setuptools in c:\python37\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=2.2->seaborn) (51.0.0)
Installing collected packages: seaborn
  Attempting uninstall: seaborn
    Found existing installation: seaborn 0.11.0
    Uninstalling seaborn-0.11.0:
      Successfully uninstalled seaborn-0.11.0
Successfully installed seaborn-0.11.2

可見 Seaborn 是建立在 Numpy, Matplotlib, Pandas, Scipy 等套件之上. 

安裝好 Seaborn 後便可用 import 匯入, 習慣上會取 sns 當作簡名, 據說這是來自連續劇 "The Test Wing" 主角全名 Samuel Norman Seaborn 的縮寫, 參考 :

如上所述, Seaborn 不是要取代 Matplotlib, 而是擴充其統計繪圖與布景功能, 所以使用 Seaborn 時也必須匯入 matplotlib.pyplot, 繪製圖形時改為呼叫 Seaborn 的繪圖函式例如直條圖是 sns.barplot(), 但顯示所繪製之圖形還是要呼叫 plt.show(), 程式結構 :

import seaborn as sns 
import matplotlib.pyplot as plt
...(略)...
sns.xxxxplot(*args)    
plt.show()    

Seaborn 通常使用函數式繪圖風格, 較少使用物件導向風格. 


二. Seaborn 的常用函式 : 

此處使用 members.js 這個工具模組來檢視 Seaborn 模組內的成員, 用法參考 :


>>> import members as mbr   
>>> mbr.list_members(sns)      
FacetGrid <class 'type'>
JointGrid <class 'type'>
PairGrid <class 'type'>
algorithms <class 'module'>
axes_style <class 'function'>
axisgrid <class 'module'>
barplot <class 'function'>
blend_palette <class 'function'>
boxenplot <class 'function'>
boxplot <class 'function'>
categorical <class 'module'>
catplot <class 'function'>
choose_colorbrewer_palette <class 'function'>
choose_cubehelix_palette <class 'function'>
choose_dark_palette <class 'function'>
choose_diverging_palette <class 'function'>
choose_light_palette <class 'function'>
clustermap <class 'function'>
cm <class 'module'>
color_palette <class 'function'>
colors <class 'module'>
countplot <class 'function'>
crayon_palette <class 'function'>
crayons <class 'dict'>
cubehelix_palette <class 'function'>
dark_palette <class 'function'>
desaturate <class 'function'>
despine <class 'function'>
displot <class 'function'>
distplot <class 'function'>
distributions <class 'module'>
diverging_palette <class 'function'>
dogplot <class 'function'>
ecdfplot <class 'function'>
external <class 'module'>
factorplot <class 'function'>
get_data_home <class 'function'>
get_dataset_names <class 'function'>
heatmap <class 'function'>
histplot <class 'function'>
hls_palette <class 'function'>
husl_palette <class 'function'>
jointplot <class 'function'>
kdeplot <class 'function'>
light_palette <class 'function'>
lineplot <class 'function'>
lmplot <class 'function'>
load_dataset <class 'function'>
matrix <class 'module'>
miscplot <class 'module'>
move_legend <class 'function'>
mpl <class 'module'>
mpl_palette <class 'function'>
pairplot <class 'function'>
palettes <class 'module'>
palplot <class 'function'>
plotting_context <class 'function'>
pointplot <class 'function'>
rcmod <class 'module'>
regplot <class 'function'>
regression <class 'module'>
relational <class 'module'>
relplot <class 'function'>
reset_defaults <class 'function'>
reset_orig <class 'function'>
residplot <class 'function'>
rugplot <class 'function'>
saturate <class 'function'>
scatterplot <class 'function'>
set <class 'function'>
set_color_codes <class 'function'>
set_context <class 'function'>
set_hls_values <class 'function'>
set_palette <class 'function'>
set_style <class 'function'>
set_theme <class 'function'>
stripplot <class 'function'>
swarmplot <class 'function'>
utils <class 'module'>
violinplot <class 'function'>
widgets <class 'module'>
xkcd_palette <class 'function'>
xkcd_rgb <class 'dict'>

可見 Seaborn 提供了非常豐富的繪圖與公用函式, 摘要說明如下表 : 

 Seaborn 常用函式 說明
 set(*args) set_theme() 的別名, 建議使用 set()
 load_dataset(name) 從網路載入資料集 (需要 Internet 連線)
 set_style(style, rc) 設定圖形之通用樣式
 set_theme(*args) 設定所有 Matplotlib 與 Seaborn 圖形之布景 (樣式, 字型, 調色板等)
 axes_style() 傳回目前主題佈景的樣式字典
 despine() 去除軸物件上方與右方的邊框
 lineplot(x, y, data) 繪製折線圖 (關係類 Relational)
 scatterplot(x, y, data) 繪製散佈圖 (關係類)
 relplot(x, y, data) 繪製散點圖 (關係類)
 displot(x, y, data) 繪製分布圖 (分布類 Distributional)
 histplot(x, y, data) 繪製直方圖 (分布類)
 kdeplot(x, y,data) 繪製核密度估計圖 (kernel density estimation) 圖 (分布類)
 ecdfplot(x, y, data) 繪製經驗累積分布圖 (empirical cumulative distribution)  (分布類)
 rugplot(x, y, data) 繪製軸鬚圖 (empirical cumulative distribution)  (分布類)
 barplot(x, y, data) 繪製長條圖 (類型類 Categorical) 
 boxplot(x, y, data) 繪製盒鬚圖 (類型類)
 boxenplot(x, y, data) 繪製進階版盒鬚圖 (用於展示高維資料, 類型類)
 countplot(x, y, data) 繪製計數圖 (分類變數的直方圖, 類型類)
 violinplot(x, y, data) 繪製小提琴圖 (類型類)
 pointplot(x, y, data) 繪製點線圖 (帶誤差棒枝散點圖, 類型類)
 swarmplot(x, y, data) 繪製分簇散點圖 (又稱蜂巢圖, 類型類)
 stripplot(x, y, data) 繪製分布散點圖 (又稱抖動散點圖, 類型類)
 catplot(x, y, data) 繪製分類圖 (類型類)
 regplot(x, y, data) 繪製迴歸圖 (預設線性迴歸, 迴歸類)
 residplot(x, y, data) 繪製迴歸殘差圖 (預設違線性迴歸, 迴歸類)
 lmplot(x, y, data) 繪製迴歸圖 (回歸類)
 heatmap(x, y, data) 繪製熱力圖 (矩陣類)
 clustermap(x, y, data) 繪製群聚圖 (矩陣類)
 FacetGrid(x, y, data) 繪製多面向直方圖 (多圖網格類)
 pairplot(x, y, data) 繪製成對關係圖 (成對網格類)
 PairGrid(x, y, data) 繪製成對網格圖 (成對網格類)
 joinplot(x, y, data) 繪製聯合分布圖 (聯合網格類)
 JointGrid(x, y, data) 繪製聯合網格圖 (聯合網格類)
 
可見 Seaborn 所支援的統計圖表真的是玲瑯滿目. 

這些函式事實上是 Matplotlib 函式的再包裝, 但在功能上區分為兩種等級 : 
  • 軸等級 (axes-level) 函式 : 
    與 Matplotlib 一樣在指定的子圖 (軸物件) 上繪圖. 
  • 畫布等級 (figure-level) 函式 :
    可依據 Pandas 的 DataFrame 中的變數分類直接在畫布上繪製多軸 (多子圖) 多種圖表. 
畫布等級函式可以用 kind 參數指定圖表種類, 用 data 參數指定 DataFrame 為資料來源, 用 col 參數指定融合的多個欄位, 只要一個指令即可繪製多軸多子圖的圖形. 

參考 :



Source : Seaborn


可見畫布等級函式有三個 : 
  • relplot() : 關聯性 (relational) 
  • displot() : 分布性 (distributional)
  • catplot() : 分類性 (categorical)
其餘均為軸等級繪圖函式. 


三. 用 loaf_dataset() 載入線上資料集 : 

Seaborn 在官網準備了許多現成的資料集可馬上載入使用, 對於學習及測試 Seaborn 功能非常方便, 只要呼叫 sns.load_dataset() 函式並傳入資料集名稱即可, 但載入時必須有 Internet 連線 (載入到快取與記憶體後即使斷線也不影響後續處理), 語法如下 : 

df=seaborn.load_dataset(name, cache=True, data_home=None, **kws)

傳回值為一個 DataFrame 物件, 必要參數 name 是資料集的名稱 (字串), 可用 sns.get_dataset_names() 查詢, 例如 : 

>>> import seaborn as sns   
>>> sns.get_dataset_names()       
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg', 'penguins', 'planets', 'taxis', 'tips', 'titanic']
 
這些資料集都是從 Kaggle, Github, 或其他公開資料源取得整理而成, 目的是作為測試時可以快速取得之資料集, 方便撰寫文件或進行可重複之測試以便提交臭蟲回報之用. 這些資料集都以 csv 檔形式儲存於 GitHub :


參數 cache 用來設定是否要將載入記憶體之資料集也存入快取 (cache), 預設為 True, 參數 data_home 用來指定本機的一個資料夾作為快取, 若未傳入則 Seaborn 會自行指定預設資料夾, 快取資料夾的位置可用 sns.get_data_home() 方法查詢, 例如 : 

>>> df=sns.load_dataset('iris')   
>>> sns.get_data_home()      
'C:\\Users\\User\\seaborn-data'     

sns.load_dataset() 會傳回代表該資料集的 DataFrame 物件, 例如 : 

>>> type(df)   
<class 'pandas.core.frame.DataFrame'>   
>>> df     
     sepal_length  sepal_width  petal_length  petal_width    species
0             5.1          3.5           1.4          0.2     setosa
1             4.9          3.0           1.4          0.2     setosa
2             4.7          3.2           1.3          0.2     setosa
3             4.6          3.1           1.5          0.2     setosa
4             5.0          3.6           1.4          0.2     setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  virginica
146           6.3          2.5           5.0          1.9  virginica
147           6.5          3.0           5.2          2.0  virginica
148           6.2          3.4           5.4          2.3  virginica
149           5.9          3.0           5.1          1.8  virginica

[150 rows x 5 columns]

這個 DataFrame 就可以作為 data 參數直接傳給 Seaborn 的 xxxxplot() 函式來繪圖了. 


四. 以 list, ndarray, 與 DataFrame 為資料源繪圖 : 

Seaborn 可以用 list, ndarray, 與 DataFrame 作為繪圖之資料來源, 以下用長條圖為例來測試這三種資料源. 長條圖屬於類別型變數 (Categorical) 的統計圖, 用來比較各類別變數的值之差異. Seaborn 用 barplot() 函式來繪製長條圖, 此函式參數很多, 參考 :


常用參數介面如下 : 

seaborn.barplot(x=None, y=None, data=None) 

其中 x 為 X 軸 (類別) 變數名稱, y 為 Y 軸變數名稱, data 是 DataFrame 變數名稱, 如果有指定 data參數的話, x 與 y 就用來分別指定 DataFrame 中的欄名做為 X 軸與 Y 軸變數. 

Seaborn 的優點是與 Pandas 緊密結合, 雖然主要是用 DataFrame 物件作為繪圖的資料源, 但它也可以像 Matplotlib 那樣用 list 或 Numpy 的 ndarray 物件當資料源來繪圖, 但傳入的 x, y 參數類型不同, 當資料源是 list 或 ndarray 時, 參數 x, y 為這些資料源的變數名稱; 當資料源是 DatFrame 時, 參數 x, y 是作為 X, Y 軸的欄索引標籤 (字串), 參考 :


"Numpy arrays and other objects that implement the Python sequence interface work too, but if they don’t have names, the plot will not be as informative without further tweaking"

下面範例以串列作為資料源來繪圖, 參考之前 Matplotlib 統計繪圖中的範例 :



測試 4-1 : 以串列作為資料源繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt

votes=[608590, 5522119, 8170231]
candidates=['James Soong', 'Korea Fish', 'Tsai Ing-Wen']
sns.barplot(x=candidates, y=votes)     
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

此例定義了類別變數 candidates 與其對應之值 votes, 然後分別傳入 sns.barplot() 作為 x 與 y 參數, 結果如下 : 




與用 Matplotlib 繪製的長條圖相比, 兩者結構是一樣的, 不同之處在於 Seaborn 會自動為三個類別變數選定三種不同的背景色, 如果是用 Matplotlib 的話則必須自行設定. 


如果要繪製水平長條圖, 在 Matplotlib 須呼叫 plt.barh() 函式, 但在 Seaborn 則仍然是呼叫 sns.barplot(), 只要將 x 與 y 參數對調即可, 因為 Seaborn 偵測到 Y 軸是類別資料, X 軸是數值資料, 就會自動呼叫 plt.barh() 繪製水平長條圖, 例如 : 


測試 4-2 : 以串列作為資料源繪製水平長條圖 [看原始碼] 

import seaborn as sns
import matplotlib.pyplot as plt

votes=[608590, 5522119, 8170231]
candidates=['James Soong', 'Korea Fish', 'Tsai Ing-Wen']
sns.barplot(x=votes, y=candidates)         # x 與 y 對調
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

結果如下 : 



Y 軸資料除了串列之外, 也可以是 Numpy 的 ndarray 物件, 例如 : 


測試 4-3 : 以 ndarray 作為資料源繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np    

votes=np.array([608590, 5522119, 8170231])       # 轉成 ndarray 物件
candidates=['James Soong', 'Korea Fish', 'Tsai Ing-Wen']
sns.barplot(x=candidates, y=votes)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

此例是將 Y 軸資料先轉成 ndarray 物件再傳入 sns.barplot(), 結果與上面測試 1 完全相同. 

下面是以 DataFrame 物件為資料源的範例 : 


測試 4-4 : 以 DataFrame 作為資料源繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.barplot(x='candidates', y='votes', data=data)    
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

此例是將 X, Y 軸資料存放於字典 election 中, 然後將其轉成 DataFrame 物件, 再把此資料框傳入 sns.barplot() 的 data 參數, 同時要用 x 參數指定要以資料框的哪一個欄位當 X 軸, 用 y 參數指定要以資料框的哪一個欄位當 Y 軸, 因為是欄索引名稱, 因此 x 與 y 的值都是字串. 結果與上面測試 1 完全相同. 


五. 設定主題佈景 : 

Seaborn 最令人驚豔的特色之一就是它的美圖效果, 只要使用預設主題背景就能繪製出高品質具吸引力的專業圖表, 這只要透過呼叫 sns.set() 或 sns.set_theme() 並傳入指定之 style 參數即可輕易達成. sns.set() 其實是 sns.set_theme() 的別名, 參數都相同 :

seaborn.set_theme(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)  

可見一個主題佈景主要由脈絡 context, 樣式 style, 調色盤 palette, 字型 font 等構成, 其中最常用的參數是樣式 style, 主要是設定整個圖形的背景色與是否要有網格 (grid) 等, 預設樣式是 'darkgrid', 可用的樣式有 5 個 :
  • darkgrid (預設)
  • whitegrid
  • dark
  • white
  • ticks
樣式除了可用 set(style='') 或 set_theme(style='') 設定外, 還可以用 set_style(style='') 設定, 效果是一樣的, 其參數如下 : 

seaborn.set_style(style=None, rc=None)   

上面的長條圖範例均未設定主題佈景, 所以背景預設都是空白, 僅僅是自動為每個長條指定不同背景色而已. 下面範例則是添加 sns.set() 以預設主題佈景的效果 : 


測試 5-1 : 以預設主題佈景繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set()      # 使用預設主題佈景, 也可用 sns.set_theme()
sns.barplot(x='candidates', y='votes', data=data)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

此例與上面範例 4-5 完全相同, 只是多了 sns.set() 而已, 此函式為 sns.set_theme() 的別名, 所以也可以呼叫 sns.set_theme(), 結果如下 : 




與上面範例相比, 此圖多了網格背景, 質感相對高出許多. 

下面範例是用 set_theme() 函式設定主題佈景為 'whitegrid' :


測試 5-2 : 以 sns.set_theme() 設定主題佈景繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set_theme(style='whitegrid')    # 也可以用 set_style('whitegrid') 
sns.barplot(x='candidates', y='votes', data=data)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

結果如下 : 




下面則改用 set_style() 將主題佈景設為 'dark' :


測試 5-3 : 以 sns.set_style() 設定主題佈景繪製垂直長條圖 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set_style('dark')      # 也可以用 set_theme(style='dark')
sns.barplot(x='candidates', y='votes', data=data)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

結果如下 : 




每一個主題佈景的設定可以用 sns.axes_style() 函式來查詢其設定, 它會傳回一個代表該主題佈景設定值的樣式字典, 例如預設的 'darkgrid' 主題佈景的設定值如下 : 

>>> sns.set()   
>>> sns.axes_style()     
{'axes.facecolor': '#EAEAF2', 'axes.edgecolor': 'white', 'axes.grid': True, 'axes.axisbelow': True, 'axes.labelcolor': '.15', 'figure.facecolor': 'white', 'grid.color': 'white', 'grid.linestyle': '-', 'text.color': '.15', 'xtick.color': '.15', 'ytick.color': '.15', 'xtick.direction': 'out', 'ytick.direction': 'out', 'lines.solid_capstyle': 'round', 'patch.edgecolor': 'w', 'patch.force_edgecolor': True, 'image.cmap': 'rocket', 'font.family': ['sans-serif'], 'font.sans-serif': ['Arial', 'DejaVu Sans', 'Liberation Sans', 'Bitstream Vera Sans', 'sans-serif'], '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}

如果在呼叫 set_style() 時傳入一個樣式字典就可以設定客製化的主題佈景了, 例如 :


測試 5-4 : 呼叫 set_style() 並傳入樣式字典以客製化主題佈景 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set_style('dark', {'axes.edgecolor': 'blue', 'axes.facecolor': 'cyan'})    
sns.barplot(x='candidates', y='votes', data=data)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

此例在呼叫 set_style() 時傳入一個樣式字典, 將軸的邊框顏色 (axes.edgecolor) 設為藍色; 將軸的背景色 (axes.edgecolor) 設為 'cyan', 結果如下 : 




如果用 set_theme() 來設定客製化主題佈景則須將樣式字典傳給 rc 參數, 例如 : 


測試 5-5 : 呼叫 set_theme() 並將樣式字典傳給 rc 參數以客製化主題佈景 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set_theme(style='dark', rc={'axes.edgecolor': 'blue', 'axes.facecolor': 'cyan'})
sns.barplot(x='candidates', y='votes', data=data)
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

結果與上面用 set_style() 相同, 不再貼圖. 

另外 Seaborn 還有一個 despine() 函式可用來去除軸物件上方與右方的軸邊框, 例如 :


測試 5-6 : 呼叫 sns.despine() 去除右方與上方軸邊框 [看原始碼]

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

election={'votes': [608590, 5522119, 8170231],
          'candidates': ['James Soong', 'Korea Fish', 'Tsai Ing-Wen']}
data=pd.DataFrame(election)
sns.set_style('dark', {'axes.edgecolor': 'blue', 'axes.facecolor': 'cyan'})
sns.barplot(x='candidates', y='votes', data=data)
sns.despine()    
plt.title('2020 Presidential Election')
plt.xlabel('Candidates')
plt.ylabel('Votes(Million)')
plt.show()

結果如下 : 




可見軸物件上方與右方的邊框都不見了. 

參考 :


沒有留言:

張貼留言