Python 可視化--Seaborn

seaborn
Seaborn是一個基於matplotlib的Python數據可視化庫。 它提供了用於繪製引人入勝且內容豐富的統計圖形的高級接口。

1. 安裝

您可以使用pip安裝最新版本的seaborn

pip install seaborn

也可以使用conda安裝發佈的版本:

conda install seaborn

另外,您可以使用pip直接從github安裝開發版本:

pip install git+https://github.com/mwaskom/seaborn.git

另一個選擇是克隆github倉庫並從本地副本安裝:

pip install .

注意seaborn依賴項

2. seaborn與matplotlib對比

讓我們定義一個簡單的函數來繪製一些偏移正弦波,通過其簡單地對比seaborn和matplotlib的不同風格。切換到seaborn默認值,只需調用set()函數。

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

# matplotlib or seaborn
style = '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)


if style == 'matplotlib':
    sinplot()
else:
    sns.set()
    sinplot()

plt.show()

左邊是matplotlib默認情況下的圖形,右邊是seaborn默認情況下的圖形:

matplotlib-seaborn
Seaborn將matplotlib參數分爲兩個獨立的組。 第一組設置plot的美學風格,第二組縮放圖形的各種元素,以便可以輕鬆地將其合併到不同的上下文中。

操縱這些參數的接口是兩對函數。要控制樣式,使用axes_style()set_style()函數。要縮放繪圖,使用 plotting_context()set_context()函數。在這兩種情況下,第一個函數返回參數字典,第二個函數設置matplotlib默認值。

3. 風格設置

3.1 主題設置

seaborn預設五種主題樣式:darkgrid(默認)、whitegriddarkwhiteticks。它們將影響軸的顏色、網格是否啓用以及其他美學元素。

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


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)


# five theme: darkgrid, whitegrid, dark, white, and ticks.
styles = ['darkgrid', 'whitegrid', 'dark', 'white', 'ticks']
select_style = styles[4]
sns.set_style(select_style)
sinplot()
plt.xlabel(select_style)
plt.show()

theme

3.2 軸設置

white和ticks主題樣式可以移除不需要的上軸和右軸,通過調用seaborn的despine()函數實現。

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


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)


styles = ['white', 'ticks']
select_style = styles[1]
sns.set_style(select_style)
sinplot()
# remove axes spines
sns.despine()
plt.xlabel(select_style)
plt.show()

remvoe-axes-spine

一些圖可以從數據中偏移軸,這也可以調用despine()完成。當刻度沒有覆蓋軸的整個範圍時,trim參數將限制軸的範圍。

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

sns.set_style("white")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
f, ax = plt.subplots()
sns.violinplot(data=data)
# offset and trim
sns.despine(offset=10, trim=True)
plt.show()

remove-axes-spine-offset-strim

還可以使用despine()的附加參數來控制刪除哪些軸。

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

sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data, palette="deep")
# remove which spines: top, right, left, bottom
sns.despine(left=True)
plt.show()

remove-axes-spine-left

3.3 臨時設置圖形樣式

雖然來回切換很容易,但是也可以在with語句中使用axes_style()函數來臨時設置繪圖參數。這也允許您使用不同樣式的軸製作圖形:

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


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)


f = plt.figure(figsize=(6, 6))
gs = f.add_gridspec(2, 2)

with sns.axes_style("darkgrid"):
    ax = f.add_subplot(gs[0, 0])
    sinplot()

with sns.axes_style("white"):
    ax = f.add_subplot(gs[0, 1])
    sinplot()

with sns.axes_style("ticks"):
    ax = f.add_subplot(gs[1, 0])
    sinplot()

with sns.axes_style("whitegrid"):
    ax = f.add_subplot(gs[1, 1])
    sinplot()

f.tight_layout()
plt.show()

temporarily-figure-style

3.4 重寫seaborn樣式

如果想要自定義seaborn樣式,可以將參數字典傳遞給axes_style()set_style()的rc參數。請注意只能通過此方法覆蓋屬於樣式定義一部分的參數。(然而,更高級的set()函數採用任何matplotlib參數的字典)。

如果想查看包含哪些參數,只需調用不帶參數的函數,它將返回當前設置:

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}

然後可以設置這些參數的不同版本:

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


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_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
plt.show()

override-style

3.5 縮放元素

一組單獨的參數控制繪圖元素的比例,這將使您可以使用相同的代碼製作適用於較大或較小繪圖的設置。

四個預設的上下文,按相對大小的順序是paper(默認)、 notebooktalkposter

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


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)


# scaling plot elements
contexts = ['paper', 'notebook', 'talk', 'poster']
select_context = contexts[3]
sns.set()
sns.set_context(select_context)
sinplot()
plt.title(select_context)
plt.show()

context

您可以使用這些名稱之一調用set_context()來設置參數,並且可以通過提供參數值字典來覆蓋參數。

您還可以在更改上下文時獨立縮放字體元素的大小。(此選項也可通過頂層set()函數實現)。

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


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()
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
plt.show()

scale

同樣,您可以用with語句臨時控制嵌套的圖形比例。

使用set()函數可以快速配置樣式和上下文。該函數還可以設置默認的調色板。

4. 顏色設置

顏色比圖形樣式的其他方面更爲重要,因爲如果有效使用顏色,則顏色可以顯示數據中的模式,而如果使用不充分,則顏色可以隱藏這些模式。 有很多很棒的資源來學習在可視化中使用顏色的良好技術,其中可以查看Rob Simmon撰寫的系列博客文章和更多技術文章。 matplotlib文檔現在還有一個不錯的教程,它說明了內置顏色圖的一些感知屬性。

通過Seaborn,可以輕鬆選擇和使用適合您正在使用的數據類型以及可視化目標的調色板。

4.1 構建調色板

使用離散調色板最重要的函數是color_palette()。這個函數爲在seaborn中生成顏色的許多(雖然不是全部)可能的方法提供了一個接口,並且它被任何具有palette參數的函數內部使用(在某些情況下,當需要多種顏色時,對於color參數也是如此)。

color_palette()將接受任何seaborn調色板或matplotlib顏色圖的名稱(jet除外,您不應該使用它)。它還可以採用任何有效的matplotlib格式(RGB元組、十六進制顏色代碼或HTML顏色名稱)指定的顏色列表。返回值始終是一個RGB元組列表。

最後,不帶參數地調用color_palette()將返回當前默認的顏色循環。

相應的函數set_palette()採用相同的參數,並將爲所有圖設置默認的顏色循環。您也可以在with語句中使用color_palette()來臨時更改默認調色板(參見下文)。

如果不瞭解數據的特性,通常不可能知道哪種調色板或色圖最適合一組數據。接下來,我們將把使用color_palette()和其他seaborn調色板函數的不同方式分成三種通用的調色板:qualitative, sequential, and diverging

4.2 Qualitative

當您想區分沒有固有順序的離散數據塊時,Qualitative(或分類)調色板是最好的。

導入seaborn時,默認顏色週期會更改爲一組十種顏色,以喚起標準的matplotlib顏色週期,同時旨在使外觀更加美觀。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set()
# default color cycle
current_palette = sns.color_palette()
sns.palplot(current_palette)
plt.show()

current-palette

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章