資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

Python資料科學發表於2019-03-01

作者:xiaoyu

微信公眾號:Python資料科學

知乎:python資料分析師


Seaborn學習大綱

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

  1. 風格管理
    • 繪圖風格設定
    • 顏色風格設定
  2. 繪圖方法
    • 資料集的分佈視覺化
    • 分類資料視覺化
    • 線性關係視覺化
  3. 結構網格
    • 資料識別網格繪圖

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

顏色風格設定

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函式則會返回當前預設的色環的列表。
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
  • 還有一個相應的函式,是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)
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

有6種不同的預設主題,它們分別是:deepmutedpastelbirghtdarkcolorblind

themes = [`deep`, `muted`, `pastel`, `bright`, `dark`, `colorblind`]
for theme in themes:
    current_palette = sns.color_palette(theme)
    sns.palplot(current_palette)
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

使用色圈系統

預設的6種顏色看上去真不錯,但是如果我們想要超過6種顏色呢?

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

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

sns.palplot(sns.color_palette("hls", 8))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

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

sns.palplot(sns.hls_palette(8, l=.3, s=.8))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

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

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

sns.palplot(sns.color_palette("husl", 8))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

同樣與之對應的,也有個husl_palette函式提供更靈活的操作。

使用分類Color Brewer調色盤

另外一種對分類資料比較友好的調色盤來自Color Brewer工具。在matplotlib中也存在這些顏色表,但是它們並沒有被合適的處理。在seaborn中,當你想要分類的 Color Brewer 調色盤的時候,你總是可以得到不連續顏色,但是這也意味著在某一點上,這些顏色將會開始迴圈。

Color Brewer 網站中的一個很好的特點就是它提供了一個色盲安全指導。色盲顏色有很多種en.wikipedia.org/wiki/Color_…,但是最常見的當屬辨別綠色和紅色。如果可以避免使用紅色和綠色來對繪圖元素上色,那麼對於一些色盲人群將會是一個很好的訊息。

下面兩組顏色就是使用紅色和綠色組合,這可能並不是最好的選擇。

sns.palplot(sns.color_palette("Paired"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.color_palette("Set2", 10))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

為了避免這些組合,我們需要從Color Brewer庫中進行選擇調色,有一個專門的 choose_colorbrewer_palette 函式可以實現這個功能。這個函式需要在 IPython notebook 中使用,因為 notebook 是一個互動式的工具,可以讓你瀏覽各種選擇並且調節引數。

sns_tpye = ["qualitative", "sequential", "diverging"]
for elem in sns_type:
    sns.choose_colorbrewer_palette(elem)
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
  • n:調節顏色的個數;
  • desat:調節明暗和飽和度;

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

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

使用xkcd顏色來命名顏色

在眾多的努力幫助下,xkcd 完成了隨機的 RGB 顏色的命名。一共生成了954個顏色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);
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

如果想要從 xkcd_rgb 字典中單獨的抽取出一些顏色,你也可以將一組選擇好的顏色放到 xkcd_palette 函式中。

colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

2. 連續色板(sequential)

調色盤的第二大類被成為 “順序”,這種調色盤對於有從低(無意義)到高(有意義)範圍過度的資料非常適合。儘管有些時候你可能想要在連續色板中使用不連續顏色,但是更通用的情況下是連續色板會作為顏色表在 kdeplot() 或者 corrplot() 或是一些 matplotlib 的函式中使用。

對於連續的資料,最好是使用那些在色調上有相對細微變化的調色盤,同時在亮度和飽和度上有很大的變化。這種方法將自然地將資料中相對重要的部分成為關注點。

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

sns.palplot(sns.color_palette("Blues"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

就像在matplotlib中一樣,如果您想要翻轉漸變,您可以在皮膚名稱中新增一個_r字尾。

sns.palplot(sns.color_palette("BuGn_r"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

seaborn還增加了一個允許建立沒有動態範圍的”dark”皮膚。如果你想按順序畫線或點,這可能是有用的,因為顏色鮮豔的線可能很難區分。

類似的,這種暗處理的顏色,需要在皮膚名稱中新增一個_d字尾。

sns.palplot(sns.color_palette("GnBu_d"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

注意,你可能想使用 choose_colorbrewer_palette() 函式取繪製各種不同的選項。如果你想返回一個變數當做顏色對映傳入seaborn或matplotlib的函式中,可以設定 as_cmap 引數為True

“cubehelix”連續調色盤

cubehelix調色盤系統在亮度和色變變化上具有線性上升或下降的特點。這意味著,當顏色表中的資訊被轉化為黑色和白色或者被一個色盲者看到的時候,它將會被儲存下來。

matplotlib 有內建的預設cubehelix 版本:

sns.palplot(sns.color_palette("cubehelix", 8))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

seaborn為cubehelix系統新增一個介面使得其可以在各種變化中都保持良好的亮度線性梯度。

通過seaborn的cubehelix_palette()函式返回的調色盤與matplotlib預設值稍有所不同,它不會在色輪周圍旋轉或覆蓋更廣的強度範圍。seaborn還改變了排序使得更重要的值顯得更暗:

sns.palplot(sns.cubehelix_palette(8))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

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

sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

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

sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

預設情況下你只會得到一些像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);
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

與前面一樣,也可以在notebook中使用choose_cubehelix_palette()來調節引數幫助選擇更適合的調色盤或顏色對映。如果想讓函式返回一個類似hexbin的顏色對映而非一個列表則需要傳入as_cmap=True

定製的連續調色盤

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

sns.palplot(sns.light_palette("green"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.dark_palette("purple"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.light_palette("navy", reverse=True))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

它們也可以建立一個顏色對映物件,而不僅僅是顏色列表。

pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

預設情況下,任何有效的matplotlib顏色可以作為輸入。另外輔助的解釋可以由input引數來控制。目前你可以在hls或husl空間中提供預設的rgb元組,您還可以使用任何有效的xkcd顏色的種子。

sns.palplot(sns.light_palette((210, 90, 60), input="husl"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.dark_palette("muted purple", input="xkcd"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

需要注意的是,husl是提供互動的元件的預設input空間,這與函式自身預設的並不同,但這在背景下卻是更有用的。

3. 離散色板

調色盤中的第三類被稱為**“離散”**。這類色板適用於資料特徵含有大的低值和大的高值。資料中通常有一個意義明確的中點。例如,如果你想要從某個基線時間點繪製溫度變化,最好使用離散的顏色表顯示相對降低和相對增加面積的地區。

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

同樣重要的是要強調,應該避免使用紅色和綠色,因為大量的潛在觀眾將無法分辨它們。

同樣,Color Brewer顏色字典裡也同時擁有一套精心挑選的離散顏色對映:

sns.palplot(sns.color_palette("BrBG", 7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.color_palette("RdBu_r", 7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.color_palette("coolwarm", 7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

定製的離散色板

你也可以使用seaborn函式 diverging_palette() 為離散的資料建立一個定製的顏色對映。(當然也有一個類似配套的互動工具:choose_diverging_palette())。該函式使用husl顏色系統的離散色板。你需要傳遞兩種色調,並可選擇性的設定明度和飽和度的端點。函式將使用husl的端點值及由此產生的中間值進行均衡。

sns.palplot(sns.diverging_palette(220, 20, n=7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

sep引數控制皮膚中間區域的兩個漸變的寬度。

sns.palplot(sns.diverging_palette(10, 220, sep=80, n=7))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

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

sns.palplot(sns.diverging_palette(255, 133, l=60, n=7, center="dark"))
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

設定預設的調色盤

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()
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

color_palette()函式也可以在一個with塊中使用,以達到臨時更改調色盤的目的。

with sns.color_palette("PuBuGn_d"):
    sinplot()
複製程式碼
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

總結

  • 本篇介紹了seaborn中的顏色調控方法,提到的一個重要函式是:color_palette()。針對不同的資料型別有三種調色方式:
    • 分類色板(qualitative)
    • 連續色板(sequential)
    • 離散色板(diverging)
  • 其中還提到了 Color Brewer 工具,它可以很好的應用在以上三種調色方式上。
  • 記住還有一個很有用的函式 choose_xxx_paletee(),用於互動式的除錯顏色。
  • 還可以通過 set_palette() 函式設定繪圖預設引數。

參考:


關注微信公眾號Python資料科學,獲取 120G 人工智慧 學習資料。

資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇
資料視覺化Seaborn從零開始學習教程(二) 顏色調控篇

相關文章