Seaborn簡介
seaborn同matplotlib一樣,也是Python進行數據可視化分析的重要第三方包。但seaborn是在 matplotlib的基礎上進行了更高級的API封裝,使得作圖更加容易,圖形更加漂亮。
seaborn並不能替代matplotlib。雖然seaborn可以滿足大部分情況下的數據分析需求,但是針對一些特殊情況,還是需要用到matplotlib的。換句話說,matplotlib更加靈活,可定制化,而seaborn像是更高級的封裝,使用方便快捷。
應該把seaborn視為matplotlib的補充,而不是替代物。
繪圖風格設置
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
首先,我們定義一個簡單的函數來繪制一些正弦波,用於測試
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默認繪圖,可以簡單的用set()方法。
import seaborn as sns
sns.set()
sinplot()
Seaborn
將 matplotlib
的參數划分為兩個獨立的組合。第一組是設置繪圖的外觀風格的,第二組主要將繪圖的各種元素按比例縮放的,以至可以嵌入到不同的背景環境中。
操控這些參數的接口主要有兩對方法:
- 控制風格:
axes_style()
,set_style()
- 縮放繪圖:
plotting_context()
,set_context()
每對方法中的第一個方法(axes_style()
, plotting_context()
)會返回一組字典參數,而第二個方法(set_style()
, set_context()
)會設置matplotlib
的默認參數。
Seaborn的五種繪圖風格
有五種seaborn的風格,它們分別是:darkgrid, whitegrid, dark, white, ticks。它們各自適合不同的應用和個人喜好。默認的主題是darkgrid。
sns.set_style('whitegrid')
data = np.random.normal(size = (20, 6)) + np.arange(6) / 2
sns.boxplot(data = data)
<matplotlib.axes._subplots.AxesSubplot at 0x1a1ae6da20>
sns.set_style('dark')
sinplot()
sns.set_style('white')
sinplot()
sns.set_style('ticks')
sinplot()
移除軸脊柱
white
和ticks
兩種風格都可以移除頂部和右側的不必要的軸脊柱。使用matplotlib是無法實現這一需求的,但是使用seaborn的despine()方法可以實現
sinplot()
sns.despine()
一些繪圖也可以針對數據將軸脊柱進行偏置,當然也是通過調用despine()方法來完成。而當刻度沒有完全覆蓋整個軸的范圍時,trim參數可以用來限制已有脊柱的范圍。
f, ax = plt.subplots()
sns.violinplot(data=data)
sns.despine(offset=10, trim=True)
也可以通過despine()控制哪個脊柱將被移除。
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True)
臨時設置繪圖風格
雖然來回切換風格很容易,但是你也可以在一個with語句中使用axes_style()方法來臨時的設置繪圖參數。這也允許你用不同風格的軸來繪圖:
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
覆蓋seaborn風格元素
如果你想定制化seaborn風格,你可以將一個字典參數傳遞給axes_style()和set_style()的參數rc。而且你只能通過這個方法來覆蓋風格定義中的部分參數。
如果你想要看看這些參數都是些什么,可以調用這個方法,且無參數,這將會返回下面的設置:
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}
然后,就可以設置這些參數的不同版本了。
sns.set_style("darkgrid",{'axes.facecolor':"0.9"})
sinplot()
繪圖元素比例
我們可以通過一套參數控制繪圖元素的比例
首先,我們通過set()
方法重置默認的參數
sns.set()
有四個預置的環境,按大小從小到大排列分別為:paper
, notebook
, talk
, poster
。其中,notebook
是默認的。
sns.set_context('paper')
sinplot()
sns.set_context('talk')
sinplot()
sns.set_context('poster')
sinplot()
我們可以通過set_context()
方法設置相關參數,並且你可以通過提供一個字典參數值來覆蓋參數。當改變環境時,你也可以獨立的去縮放字體元素的大小。
sns.set_context('notebook',font_scale = 1.5, rc = {'lines.linewidth':2.5})
sinplot()
同樣也可以通過with
語句控制繪圖的比例
顏色風格設置
在Seaborn的使用中,是可以針對數據類型而選擇合適的顏色,並且使用選擇的顏色進行可視化,節省了大量的可視化的顏色調整工作。
還是一樣,在介紹如何使用顏色外觀設置之前,我們引入所需要的模塊。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={'figure.figsize':(6, 6)})
np.random.seed(sum(map(ord, 'palettes')))
建立調色板
對於不連續的外觀顏色設置而言,最重要的函數恐怕要屬color_palette了。這個函數擁有許多方法,讓你可以隨心所欲的可以生成各種顏色。並且,它可以被任何有palette參數的函數在內部進行使用(palette的中文意思是 "調色板")。
關於這個函數有幾個點需要知道一下:
- color_palette函數可以接受任何seaborn或者matplotlib顏色表中顏色名稱(除了jet),也可以接受任何有效的matplotlib形式的顏色列表(比如RGB元組,hex顏色代碼,或者HTML顏色名稱)。
- 這個函數的返回值總是一個由RGB元組組成的列表,無參數調用color_palette函數則會返回當前默認的色環的列表。
sns.color_palette()
[(0.2980392156862745, 0.4470588235294118, 0.6901960784313725),
(0.8666666666666667, 0.5176470588235295, 0.3215686274509804),
(0.3333333333333333, 0.6588235294117647, 0.40784313725490196),
(0.7686274509803922, 0.3058823529411765, 0.3215686274509804),
(0.5058823529411764, 0.4470588235294118, 0.7019607843137254),
(0.5764705882352941, 0.47058823529411764, 0.3764705882352941),
(0.8549019607843137, 0.5450980392156862, 0.7647058823529411),
(0.5490196078431373, 0.5490196078431373, 0.5490196078431373),
(0.8, 0.7254901960784313, 0.4549019607843137),
(0.39215686274509803, 0.7098039215686275, 0.803921568627451)]
- 還有一個相應的函數,是set_palette,它接受與color_palette一樣的參數,並會對所有的繪圖的默認色環進行設置。當然,你也可以在with語句中使用color_palette來臨時的改變默認顏色。
通常,在不知道數據特點的情況下,要找出並知道哪組顏色對一組數據是最好的有點不太現實。因此,我們將分為多種方式來使用color_palette函數和其它的 seaborn paletee 函數。
有三種通用的color palette可以使用,它們分別是:qualitative,sequential,diverging。
分類色板(quanlitative)
Qualitative調色板,也可以說成是 類型 調色板,因為它對於分類數據的顯示很有幫助。當你想要區別 不連續的且內在沒有順序關系的 數據時,這個方式是最好的。
當導入seaborn時,默認的色環就被改變成一組包含6種顏色的調色板,它使用了標准的matplolib色環,為了讓繪圖變得更好看一些。
current_palette = sns.color_palette()
sns.palplot(current_palette)
有6種不同的默認主題,它們分別是:deep,muted,pastel,birght,dark,colorblind。
themes = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']
for theme in themes:
current_palette = sns.color_palette(theme)
sns.palplot(current_palette)
使用色圈系統
默認是有10種顏色,但是我們要想要其他種類的顏色分配
或者說當你有超過10種類型的數據要區分時,最簡單的方法就是 在一個色圈空間內使用均勻分布的顏色。這也是當需要使用更多顏色時大多數seaborn函數的默認方式。
最常用的方法就是使用 hls 色空間,它是一種簡單的RGB值的轉換。
sns.palplot(sns.color_palette('hls', 8))
除此之外,還有一個 hls_palette 函數,它可以讓你控制 hls 顏色的亮度和飽和度。
sns.palplot(sns.hls_palette(8, l=.3, s=.7))
然而,由於人類視覺系統工作的原因,根據RGB顏色產生的平均視覺強度的顏色,從視覺上看起來並不是相同的強度。如果你觀察仔細,就會察覺到,黃色和綠色會更亮一些,而藍色則相對暗一些。因此,如果你想用hls系統達到一致性的效果,就會出現上面的問題。
為了修補這個問題,seaborn給hls系統提供了一個接口,可以讓操作者簡單容易的選擇均勻分布,且亮度和飽和度看上去明顯一致的色調。
sns.palplot(sns.color_palette('husl', 8))
同樣與之對應的,也有個husl_palette函數提供更靈活的操作。
使用分類Color Brewer調色板
另外一種對分類數據比較友好的調色板來自Color Brewer工具。在matplotlib中也存在這些顏色表,但是它們並沒有被合適的處理。在seaborn中,當你想要分類的 Color Brewer 調色板的時候,你總是可以得到不連續顏色,但是這也意味着在某一點上,這些顏色將會開始循環。
Color Brewer 網站中的一個很好的特點就是它提供了一個色盲安全指導。色盲顏色有很多種http://en.wikipedia.org/wiki/Color_blindness, 但是最常見的當屬辨別綠色和紅色。如果可以避免使用紅色和綠色來對繪圖元素上色,那么對於一些色盲人群將會是一個很好的消息。
下面兩組顏色就是使用紅色和綠色組合,這可能並不是最好的選擇。
sns.palplot(sns.color_palette('Paired',8))
sns.palplot(sns.color_palette("Set2", 10))
為了避免這些組合,我們需要從Color Brewer庫中進行選擇調色,有一個專門的 choose_colorbrewer_palette 函數可以實現這個功能。這個函數需要在 IPython notebook 中使用,因為 notebook 是一個交互式的工具,可以讓你瀏覽各種選擇並且調節參數。
sns_type = ["qualitative", "sequential", "diverging"]
for elem in sns_type:
sns.choose_colorbrewer_palette(elem)
interactive(children=(Dropdown(description='name', options=('Set1', 'Set2', 'Set3', 'Paired', 'Accent', 'Paste…
interactive(children=(Dropdown(description='name', options=('Greys', 'Reds', 'Greens', 'Blues', 'Oranges', 'Pu…
interactive(children=(Dropdown(description='name', options=('RdBu', 'RdGy', 'PRGn', 'PiYG', 'BrBG', 'RdYlBu', …
當然,您可能只想使用一組您特別喜歡的顏色。因為color_palette()接受一個顏色列表,這很容易做到。
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))
連續色板(sequential)
調色板的第二大類被成為 "順序",這種調色板對於有從低(無意義)到高(有意義)范圍過度的數據非常適合。盡管有些時候你可能想要在連續色板中使用不連續顏色,但是更通用的情況下是連續色板會作為顏色表在 kdeplot() 或者 corrplot() 或是一些 matplotlib 的函數中使用。
對於連續的數據,最好是使用那些在色調上有相對細微變化的調色板,同時在亮度和飽和度上有很大的變化。這種方法將自然地將數據中相對重要的部分成為關注點。
Color Brewer 的字典中就有一組很好的調色板。它們是以在調色板中的主導顏色(或顏色)命名的.
sns.palplot(sns.color_palette('Blues'))
與在matplotlib中一樣,如果想要翻轉漸變,可以在名稱后加_r
后綴
sns.palplot(sns.color_palette('Blues_r'))
seaborn還增加了一個允許創建沒有動態范圍的"dark"面板。如果你想按順序畫線或點,這可能是有用的,因為顏色鮮艷的線可能很難區分。
類似的,這種暗處理的顏色,需要在面板名稱中添加一個_d后綴。
sns.palplot(sns.color_palette('GnBu_d'))
注意,你可能想使用 choose_colorbrewer_palette() 函數取繪制各種不同的選項。如果你想返回一個變量當做顏色映射傳入seaborn或matplotlib的函數中,可以設置 as_cmap 參數為True。
離散色板
調色板中的第三類被稱為“離散”。這類色板適用於數據特征含有大的低值和大的高值。數據中通常有一個意義明確的中點。例如,如果你想要從某個基線時間點繪制溫度變化,最好使用離散的顏色表顯示相對降低和相對增加面積的地區。
除了你想滿足一個低強度顏色的中點以及用不同起始顏色的兩個相對微妙的變化,其實選擇離散色板的規則類似於順序色板。同樣重要的是,起始值的亮度和飽和度是相同的。
同樣重要的是要強調,應該避免使用紅色和綠色,因為大量的潛在觀眾將無法分辨它們。
同樣,Color Brewer顏色字典里也同時擁有一套精心挑選的離散顏色映射
sns.palplot(sns.color_palette('BrBG', 7))
sns.palplot(sns.color_palette("RdBu_r", 7))
sns.palplot(sns.color_palette("coolwarm", 7))
定制的離散色板
也可以使用seaborn函數 diverging_palette() 為離散的數據創建一個定制的顏色映射。(當然也有一個類似配套的互動工具:choose_diverging_palette())。該函數使用husl顏色系統的離散色板。你需要傳遞兩種色調,並可選擇性的設定明度和飽和度的端點。函數將使用husl的端點值及由此產生的中間值進行均衡。
sns.palplot(sns.diverging_palette(220, 20, n=7))
sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))
設置默認的調色板
color_palette() 函數有一個名為set_palette()的配套使用函數。 set_palette()。set_palette()接受與color_palette()相同的參數,但是它會更改默認的matplotlib參數,以便成為所有的調色板配置。
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)
sns.set_palette("husl")
sinplot()
color_palette()函數也可以在一個with塊中使用,以達到臨時更改調色板的目的。
with sns.color_palette("PuBuGn_d"):
sinplot()