iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
3
AI & Data

資幾資比系列 第 5

[Series - 4] Seaborn

  • 分享至 

  • xImage
  •  

前言

今天延續上一篇說明繪圖的工具,其中 Seaborn 有很多很強大的功能,也同時有更多的美化效果。

此篇文是由 Joyce 所撰寫


實作連結


Seaborn

  • Seaborn也是Python很重要的繪圖軟件
  • 在上一篇我們有介紹到Matplotlib是NumPy的圖形化介面,而Seaborn則是NumPy與Pandas的圖形化介面
  • Seaborn可用更簡潔的寫法達到與Matplotlib同樣的效果
  • 大體上,可以將它視為Matplotlib的進階版,可以更加快速,且更加美觀的繪製出圖形
  • 接下來,會分成兩部分介紹
    1. 圖形美化
    2. 繪製圖形

環境準備

如果想用自己的電腦來跑的話需要安裝 Package

# For anoconda (recommend)
$ conda install seaborn

# For pip
$ pip install seaborn

引入函數

要使用Seaborn函數,需要先引入seaborn,習慣上會用sns作為縮寫。

import seaborn as sns # 引入Seaborn

圖形美化


背景

Seaborn有預設好圖形的背景顏色,有五種設定值,可以使用set_style( )進行更改,或是在set()裡更改style的參數。

  1. white:白色
  2. whitegrid:白色網格
  3. dark:灰色
  4. darkgrid:灰色網格
  5. ticks:刻度

實作

import numpy as np # 引入NumPy
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(1,11) # x軸的值
y = [3,1,8,5,4,2,4,6,3,7]  # y軸的值

plt.title("change background") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
sns.set(style = "whitegrid") # 白色網格背景
plt.bar(x, y) # 繪製長條圖
plt.show() # 顯現圖形 

移除邊框

在繪圖上,為了美感,有時不想要四周圍的邊框,在Matplotlib中是無法移除的,但Seaborn解決了這個困擾,利用despine()這個函數,預設上方跟右方的邊框會消失。

  • top=True
  • right=True
  • left=False
  • bottom=False

實作

import numpy as np # 引入NumPy
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(1,11) # x軸的值
y = [3,1,8,5,4,2,4,6,3,7]  # y軸的值

plt.title("despine practice") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱

sns.set(style = "white") # 白色網格背景
sns.despine(top = True, right = True) # 移除上方跟右方的框線 
plt.bar(x, y) # 繪製長條圖
plt.show() # 顯現圖形 

線的粗細

Seaborn也預設好四種線的粗細,可以進行修改,預設的話是notebook,根據上到下的順序,線由細到粗。與style相同,有兩種方式可以使用,第一種set_context( ),第二種是在set()裡更改context的參數。

  • paper
  • notebook(預設)
  • talk
  • poster

實作

import numpy as np # 引入NumPy
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

x = np.arange(-180, 180)
y = np.sin(x * np.pi / 180.0)

plt.title("context practice") # 圖的標題
plt.xlabel("x axis") # x軸的名稱
plt.ylabel("y axis") # y軸的名稱
sns.set(context = "talk") # 改變線條的粗細
plt.plot(x, y) # 繪製x,y軸的圖
plt.show() # 顯現圖形

顏色設定

Seaborn提供的作法是調色盤的方式,可以想像成先把顏色調好,要用的時候,在將顏色圖上去。利用color_palette()這個函數,可以設定我們想要的調色盤。

seaborn.color_palette(palette=None, n_colors=None, desat=None)
  • palette : 調色盤
  • n_colors : n個顏色
  • deset : 飽和度,值界在0到1之間

基本盤

預設的顏色有十種,可以透過六種預設的主題進行修改。

  • deep
  • muted
  • pastel
  • bright
  • dark
  • colorblind
實作
current_palette = sns.color_palette() # 預設的調色盤
sns.palplot(current_palette) # 顯示調色盤

bright_palette = sns.color_palette("bright") # 改變主題
sns.palplot(bright_palette )# 顯示調色盤

漸層盤

在繪製等高線圖的時候,會利用顏色的深淺來表示高度,Seaborn也有提供漸層的調色盤。

漸層盤提供相當多的參數可進行選擇,如果直接使用顏色來表示的話,注意第一個字母要大寫,結尾要加上s,例如:"Blues"

實作
blue_palette = sns.color_palette("Blues") # 藍色的調色盤,由淺到深
sns.palplot(blue_palette) # 顯示調色盤

blue_r_palette = sns.color_palette("Blues_r") # 藍色的調色盤,由深到淺
sns.palplot(blue_r_palette) # 顯示調色盤

OrRd_palette = sns.color_palette("OrRd") # 橘色混紅色的調色盤
sns.palplot(OrRd_palette) # 顯示調色盤

hls盤

利用h(色相)、l(亮度)、s(飽和度)三個的值可以調配出更多的顏色。

  • h : 色相,值界在0到1之間
  • l : 亮度,值界在0到1之間
  • s : 飽和度,值界在0到1之間
實作
hls_default_palette = sns.hls_palette() # hls預設的調色盤
sns.palplot(hls_default_palette) # 顯示調色盤

hls_palette = sns.hls_palette(h = 0.5, l = 0.4, s = 0.6) # 改變hls的預設值
sns.palplot(hls_palette) # 顯示調色盤

正試塗色

沿用上一章圓餅圖的例子

自己塗色
import numpy as np # 引入NumPy
import matplotlib.pyplot as plt # 引入matplotlib的函數

category = ["clothing", "book", "meal", "snacks"] # 總類名稱
expand = [2000, 1500, 3000, 800]  # 圓餅圖的值
color = ["red", "yellow", "green", "blue"] # 設定顏色

plt.title("pie chart") # 圖的標題
plt.pie(expand, labels = category, colors = color) # 繪製圓餅圖
plt.show() # 顯現圖形 

Seaborn調色盤
import numpy as np # 引入NumPy
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

category = ["clothing", "book", "meal", "snacks"] # 總類名稱
expand = [2000, 1500, 3000, 800]  # 圓餅圖的值

plt.title("pie chart") # 圖的標題
hls_default_palette = sns.hls_palette()
plt.pie(expand, labels = category, colors = hls_default_palette) # 繪製圓餅圖
plt.show() # 顯現圖形 


繪製圖形

在Seaborn裡,提供了幾種圖形,讓資料可透過圖形的呈現令人一目了然。首先,先在檔案中,放入再來要分析的csv檔。
data 連結

資料形式


長條圖

在Matplotliib裡也有提供長條圖的畫法,但Seaborn提供的功能更多,像是它可以使用DataFrame的資料進行分析,也可以顯示平均值、中位數的位置之類的。

實作

顯示平均值
import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("barplot practice") # 圖的標題
sns.barplot(x="day", y="total_bill", data = df) # 繪製長條圖
plt.show() # 顯現圖形 

顯示中位數
import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數
from numpy import median # 引入median函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("barplot practice2") # 圖的標題
sns.barplot(x="day", y="total_bill", data = df, estimator=median) # 繪製長條圖
plt.show() # 顯現圖形 


計數圖

因為英文是countplot,所以名稱叫計數圖,其實就是直方圖的意思。

實作

import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("countplot practice") # 圖的標題
sns.countplot(x="size", hue = "sex", data = df) # 繪製計數圖
plt.show() # 顯現圖形 


盒狀圖

盒狀圖即是四分位圖,用來顯示資料的分散程度。

實作

import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("boxplot practice") # 圖的標題
sns.boxplot(x="day",y="total_bill",hue="sex",data=df) # 繪製盒狀圖
plt.show() # 顯現圖形 


密度圖

此圖就是折線圖的概念,但不會像折線圖那樣有明顯的折點,此圖的區間分布是連續的,因此線段看起來是平滑的。

實作

import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("kdeplot practice") # 圖的標題
sns.kdeplot(df["tip"]) # 繪製密度圖
plt.show() # 顯現圖形 

import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("kdeplot practice2") # 圖的標題
sns.kdeplot(df["total_bill"], shade=True) # 繪製密度圖
plt.show() # 顯現圖形 


直方密度圖

distplot(),此函數結合了Matplotlib的hist()与kdeplot的功能,兩種圖形可以同時呈現,當然透過True和False可以關掉其中一種。

實作

import pandas as pd # 引入Pandas
import seaborn as sns # 引入Seaborn
import matplotlib.pyplot as plt # 引入matplotlib的函數

df = pd.read_csv("tips.csv")  # 讀入檔案

plt.title("distplot practice") # 圖的標題
sns.distplot(df["tip"]) # 繪製直方密度圖
plt.show() # 顯現圖形 


結語

這兩篇終於把繪圖的工具結束了~雖然有很多小細節,但是之後會用到的也不會那麼多,這邊列出來給大家做個參考,如果看到自己喜歡的工具也可以開始應用!


參考資料


上一篇
[Series - 3] Matplotlib
下一篇
[Series - 5] 資料種類介紹
系列文
資幾資比31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言