做者:xiaoyu
微信公衆號:Python數據科學
知乎:python數據分析師html
seaborn
的學習內容主要包含如下幾個部分:python
風格管理windows
顏色風格設置
繪圖方法安全
結構網格微信
本次將主要介紹顏色調控
的使用。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
顏色名稱)。color_palette
函數則會返回當前默認的色環的列表。
set_palette
,它接受與color_palette
同樣的參數,並會對全部的繪圖的默認色環進行設置。固然,你也能夠在with
語句中使用color_palette
來臨時的改變默認顏色。一般,在不知道數據特色的狀況下,要找出並知道哪組顏色對一組數據是最好的有點不太現實。所以,咱們將分爲多種方式來使用color_palette
函數和其它的 seaborn paletee
函數。
有三種通用的color palette
可使用,它們分別是:qualitative,sequential,diverging。
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)
默認的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
系統達到一致性的效果,就會出現上面的問題。
爲了修補這個問題,seaborn
給hls
系統提供了一個接口,可讓操做者簡單容易的選擇均勻分佈,且亮度和飽和度看上去明顯一致的色調。
sns.palplot(sns.color_palette("husl", 8))
一樣與之對應的,也有個husl_palette
函數提供更靈活的操做。
另一種對分類數據比較友好的調色板來自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)
固然,您可能只想使用一組您特別喜歡的顏色。由於color_palette()接受一個顏色列表,這很容易作到。
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"] sns.palplot(sns.color_palette(flatui))
在衆多的努力幫助下,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))
調色板的第二大類被成爲 "順序",這種調色板對於有從低(無心義)到高(有意義)範圍過分的數據很是適合。儘管有些時候你可能想要在連續色板中使用不連續顏色,可是更通用的狀況下是連續色板會做爲顏色表在 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
調色板系統在亮度和色變變化上具備線性上升或降低的特色。這意味着,當顏色表中的信息被轉化爲黑色和白色或者被一個色盲者看到的時候,它將會被保存下來。
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_palette
和 choose_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空間,這與函數自身默認的並不一樣,但這在背景下倒是更有用的。
調色板中的第三類被稱爲「離散」。這類色板適用於數據特徵含有大的低值和大的高值。數據中一般有一個意義明確的中點。例如,若是你想要從某個基線時間點繪製溫度變化,最好使用離散的顏色表顯示相對下降和相對增長面積的地區。
除了你想知足一個低強度顏色的中點以及用不一樣起始顏色的兩個相對微妙的變化,其實選擇離散色板的規則相似於順序色板。一樣重要的是,起始值的亮度和飽和度是相同的。
一樣重要的是要強調,應該避免使用紅色和綠色,由於大量的潛在觀衆將沒法分辨它們。
一樣,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()。針對不一樣的數據類型有三種調色方式:
參考: http://seaborn.pydata.org/tut...
關注微信公衆號Python數據科學,獲取 120G
人工智能 學習資料。