數據可視化Seaborn從零開始學習教程(二) 顏色調控篇

做者:xiaoyu
微信公衆號:Python數據科學
知乎:python數據分析師html


Seaborn學習大綱

seaborn的學習內容主要包含如下幾個部分:python

  1. 風格管理windows

    • 繪圖風格設置
    • 顏色風格設置
  2. 繪圖方法安全

    • 數據集的分佈可視化
    • 分類數據可視化
    • 線性關係可視化
  3. 結構網格微信

    • 數據識別網格繪圖

本次將主要介紹顏色調控的使用。dom

顏色風格設置

Seaborn的使用中,是能夠針對數據類型而選擇合適的顏色,而且使用選擇的顏色進行可視化,節省了大量的可視化的顏色調整工做。函數

仍是同樣,在介紹如何使用顏色外觀設置以前,咱們引入所須要的模塊。工具

%matplotlib inline
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")))

下面全部操做均在 Jupyter notebook 中執行,若是對這個軟件還不熟悉的朋友能夠參考:Jupyter notebook快速入門教程學習

創建調色板

對於不連續的外觀顏色設置而言,最重要的函數恐怕要屬color_palette了。這個函數擁有許多方法,讓你能夠爲所欲爲的能夠生成各類顏色。而且,它能夠被任何有palette參數的函數在內部進行使用(palette的中文意思是 "調色板")。網站

關於這個函數有幾個點須要知道一下:

  • color_palette函數能夠接受任何seaborn或者matplotlib顏色表中顏色名稱(除了jet),也能夠接受任何有效的matplotlib形式的顏色列表(好比RGB元組,hex顏色代碼,或者HTML顏色名稱)。
  • 這個函數的返回值老是一個由RGB元組組成的列表,無參數調用color_palette函數則會返回當前默認的色環的列表。

圖片描述

  • 還有一個相應的函數,是set_palette,它接受與color_palette同樣的參數,並會對全部的繪圖的默認色環進行設置。固然,你也能夠在with語句中使用color_palette來臨時的改變默認顏色。

一般,在不知道數據特色的狀況下,要找出並知道哪組顏色對一組數據是最好的有點不太現實。所以,咱們將分爲多種方式來使用color_palette函數和其它的 seaborn paletee 函數。

有三種通用的color palette可使用,它們分別是:qualitativesequentialdiverging

1. 分類色板(quanlitative)

Qualitative調色板,也能夠說成是 類型 調色板,由於它對於分類數據的顯示頗有幫助。當你想要區別 不連續的且內在沒有順序關係的 數據時,這個方式是最好的。

當導入seaborn時,默認的色環就被改變成一組包含6種顏色的調色板,它使用了標準的matplolib色環,爲了讓繪圖變得更好看一些。

current_palette = sns.color_palette()
sns.palplot(current_palette)

圖片描述

有6種不一樣的默認主題,它們分別是:deepmutedpastelbirghtdarkcolorblind

themes = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']
for theme in themes:
    current_palette = sns.color_palette(theme)
    sns.palplot(current_palette)

圖片描述

使用色圈系統

默認的6種顏色看上去真不錯,可是若是咱們想要超過6種顏色呢?

當你有超過6種類型的數據要區分時,最簡單的方法就是 在一個色圈空間內使用均勻分佈的顏色。這也是當須要使用更多顏色時大多數seaborn函數的默認方式。

最經常使用的方法就是使用 hls 色空間,它是一種簡單的RGB值的轉換。

sns.palplot(sns.color_palette("hls", 8))

圖片描述

除此以外,還有一個 hls_palette 函數,它可讓你控制 hls 顏色的亮度和飽和度。

sns.palplot(sns.hls_palette(8, l=.3, s=.8))

圖片描述

然而,因爲人類視覺系統工做的緣由,根據RGB顏色產生的平均視覺強度的顏色,從視覺上看起來並非相同的強度。若是你觀察仔細,就會察覺到,黃色和綠色會更亮一些,而藍色則相對暗一些。所以,若是你想用hls系統達到一致性的效果,就會出現上面的問題。

爲了修補這個問題,seabornhls系統提供了一個接口,可讓操做者簡單容易的選擇均勻分佈,且亮度和飽和度看上去明顯一致的色調。

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"))

圖片描述

sns.palplot(sns.color_palette("Set2", 10))

圖片描述

爲了不這些組合,咱們須要從Color Brewer庫中進行選擇調色,有一個專門的 choose_colorbrewer_palette 函數能夠實現這個功能。這個函數須要在 IPython notebook 中使用,由於 notebook 是一個交互式的工具,可讓你瀏覽各類選擇而且調節參數。

sns_tpye = ["qualitative", "sequential", "diverging"]
for elem in sns_type:
    sns.choose_colorbrewer_palette(elem)

圖片描述

圖片描述

圖片描述

  • n:調節顏色的個數;
  • desat:調節明暗和飽和度;

固然,您可能只想使用一組您特別喜歡的顏色。由於color_palette()接受一個顏色列表,這很容易作到。

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))

圖片描述

使用xkcd顏色來命名顏色

在衆多的努力幫助下,xkcd 完成了隨機的 RGB 顏色的命名。一共生成了954個顏色http://xkcd.com/color/rgb/,並可能夠隨時經過xkcd_rgb字典調用。

plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3);

圖片描述

若是想要從 xkcd_rgb 字典中單獨的抽取出一些顏色,你也能夠將一組選擇好的顏色放到 xkcd_palette 函數中。

colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))

圖片描述

2. 連續色板(sequential)

調色板的第二大類被成爲 "順序",這種調色板對於有從低(無心義)到高(有意義)範圍過分的數據很是適合。儘管有些時候你可能想要在連續色板中使用不連續顏色,可是更通用的狀況下是連續色板會做爲顏色表在 kdeplot() 或者 corrplot() 或是一些 matplotlib 的函數中使用。

對於連續的數據,最好是使用那些在色調上有相對細微變化的調色板,同時在亮度和飽和度上有很大的變化。這種方法將天然地將數據中相對重要的部分紅爲關注點。

Color Brewer 的字典中就有一組很好的調色板。它們是以在調色板中的主導顏色(或顏色)命名的。

sns.palplot(sns.color_palette("Blues"))

圖片描述

就像在matplotlib中同樣,若是您想要翻轉漸變,您能夠在面板名稱中添加一個_r後綴。

sns.palplot(sns.color_palette("BuGn_r"))

圖片描述

seaborn還增長了一個容許建立沒有動態範圍的"dark"面板。若是你想按順序畫線或點,這多是有用的,由於顏色鮮豔的線可能很難區分。

相似的,這種暗處理的顏色,須要在面板名稱中添加一個_d後綴。

sns.palplot(sns.color_palette("GnBu_d"))

圖片描述

注意,你可能想使用 choose_colorbrewer_palette() 函數取繪製各類不一樣的選項。若是你想返回一個變量當作顏色映射傳入seaborn或matplotlib的函數中,能夠設置 as_cmap 參數爲True

「cubehelix」連續調色板

cubehelix調色板系統在亮度和色變變化上具備線性上升或降低的特色。這意味着,當顏色表中的信息被轉化爲黑色和白色或者被一個色盲者看到的時候,它將會被保存下來。

matplotlib 有內建的默認cubehelix 版本:

sns.palplot(sns.color_palette("cubehelix", 8))

圖片描述

seaborn爲cubehelix系統添加一個接口使得其能夠在各類變化中都保持良好的亮度線性梯度。

經過seaborn的cubehelix_palette()函數返回的調色板與matplotlib默認值稍有所不一樣,它不會在色輪周圍旋轉或覆蓋更廣的強度範圍。seaborn還改變了排序使得更重要的值顯得更暗:

sns.palplot(sns.cubehelix_palette(8))

圖片描述

其餘cubehelix_palette()的參數主要調整色板的視覺。兩個重要的選擇是:start(值的範圍爲03)和rot,或者旋轉的次數(-1和1之間)

sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))

圖片描述

你也能夠控制斷點的亮度和甚至對調結果順序:

sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))

圖片描述

默認狀況下你只會獲得一些像seaborn其它調色板同樣的顏色列表,但你也能夠經過使用as_cmap=True讓調色板返回一個能夠被傳入seaborn或matplotlib函數的顏色映射對象。

x, y = np.random.multivariate_normal([0, 0], [[1, -.5], [-.5, 1]], size=300).T
cmap = sns.cubehelix_palette(light=1, as_cmap=True)
sns.kdeplot(x, y, cmap=cmap, shade=True);

圖片描述

與前面同樣,也能夠在notebook中使用choose_cubehelix_palette()來調節參數幫助選擇更適合的調色板或顏色映射。若是想讓函數返回一個相似hexbin的顏色映射而非一個列表則須要傳入as_cmap=True

定製的連續調色板

對於一個更簡單的接口定製連續色板,你可使用light_palette() 或者 dark_palette()函數。它們都是單一顏色,而且能產生從亮值或者暗去飽和的值到這個顏色的調色板。伴隨着這些函數,也一樣有 choose_light_palettechoose_dark_palette 兩個函數來交互式的調節建立調色板。

sns.palplot(sns.light_palette("green"))

圖片描述

sns.palplot(sns.dark_palette("purple"))

圖片描述

sns.palplot(sns.light_palette("navy", reverse=True))

圖片描述

它們也能夠建立一個顏色映射對象,而不只僅是顏色列表。

pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);

圖片描述

默認狀況下,任何有效的matplotlib顏色能夠做爲輸入。另外輔助的解釋能夠由input參數來控制。目前你能夠在hls或husl空間中提供默認的rgb元組,您還可使用任何有效的xkcd顏色的種子。

sns.palplot(sns.light_palette((210, 90, 60), input="husl"))

圖片描述

sns.palplot(sns.dark_palette("muted purple", input="xkcd"))

圖片描述

須要注意的是,husl是提供交互的組件的默認input空間,這與函數自身默認的並不一樣,但這在背景下倒是更有用的。

3. 離散色板

調色板中的第三類被稱爲「離散」。這類色板適用於數據特徵含有大的低值和大的高值。數據中一般有一個意義明確的中點。例如,若是你想要從某個基線時間點繪製溫度變化,最好使用離散的顏色表顯示相對下降和相對增長面積的地區。

除了你想知足一個低強度顏色的中點以及用不一樣起始顏色的兩個相對微妙的變化,其實選擇離散色板的規則相似於順序色板。一樣重要的是,起始值的亮度和飽和度是相同的。

一樣重要的是要強調,應該避免使用紅色和綠色,由於大量的潛在觀衆將沒法分辨它們。

一樣,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))

圖片描述
sep參數控制面板中間區域的兩個漸變的寬度。

sns.palplot(sns.diverging_palette(10, 220, sep=80, n=7))

圖片描述

也能夠用中間的色調來選擇調色,而不是用亮度。

sns.palplot(sns.diverging_palette(255, 133, l=60, n=7, center="dark"))

圖片描述

設置默認的調色板

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()

圖片描述

總結

  • 本篇介紹了seaborn中的顏色調控方法,提到的一個重要函數是:color_palette()。針對不一樣的數據類型有三種調色方式:

    • 分類色板(qualitative)
    • 連續色板(sequential)
    • 離散色板(diverging)
  • 其中還提到了 Color Brewer 工具,它能夠很好的應用在以上三種調色方式上。
  • 記住還有一個頗有用的函數 choose_xxx_paletee(),用於交互式的調試顏色。
  • 還能夠經過 set_palette() 函數設置繪圖默認參數。
參考: http://seaborn.pydata.org/tut...

關注微信公衆號Python數據科學,獲取 120G 人工智能 學習資料。

圖片描述
圖片描述

相關文章
相關標籤/搜索