原文轉載 https://segmentfault.com/a/1190000014966210
Seaborn學習大綱
seaborn
的學習內容主要包含以下幾個部分:
-
風格管理
- 繪圖風格設置
顏色風格設置
-
繪圖方法
- 數據集的分布可視化
- 分類數據可視化
- 線性關系可視化
-
結構網格
- 數據識別網格繪圖
本次將主要介紹顏色調控
的使用。
顏色風格設置
在Seaborn的使用中,是可以針對數據類型而選擇合適的顏色,並且使用選擇的顏色進行可視化,節省了大量的可視化的顏色調整工作。還是一樣,在介紹如何使用顏色外觀設置之前,我們引入所需要的模塊。
%matplotlib inline import numpy as np import seaborn as sns import matplotlib.pyplot as plt sns.set(rc={"figure.figsize": (6, 6)})# 表示圖標長寬尺寸,大小為英尺(inch) np.random.seed(sum(map(ord, "palettes")))
建立調色板
對於不連續的外觀顏色設置而言,最重要的函數恐怕要屬color_palette了。這個函數擁有許多方法,讓你可以隨心所欲的可以生成各種顏色。並且,它可以被任何有palette參數的函數在內部進行使用(palette的中文意思是 "調色板")。 關於這個函數有幾個點需要知道一下:
**(1)color_palette函數可以接受任何seaborn或者matplotlib顏色表中顏色名稱(除了jet),也可以接受任何有效的matplotlib形式的顏色列表(比如RGB元組,hex顏色代碼,或者HTML顏色名稱)。
**(2)這個函數的返回值總是一個由RGB元組組成的列表,無參數調用color_palette函數則會返回當前默認的色環的列表。
sns.color_palette()
**(3)還有一個相應的函數,是set_palette,它接受與color_palette一樣的參數,並會對所有的繪圖的默認色環進行設置。當然,你也可以在with語句中使用color_palette來臨時的改變默認顏色。
有三種通用的color palette可以使用,它們分別是:qualitative,sequential,diverging。
分類色板(quanlitative)
Qualitative調色板,也可以說成是類型調色板,因為它對於分類數據的顯示很有幫助。當你想要區別不連續的且內在沒有順序關系的 數據時,這個方式是最好的。 當導入seaborn時,默認的色環就被改變成一組包含10種顏色的調色板,它使用了標准的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調色板
另外一種對分類數據比較友好的調色板來自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_type = ["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))
連續色板(sequential)
調色板的第二大類被成為 "順序",這種調色板對於有從低(無意義)到高(有意義)范圍過度的數據非常適合。盡管有些時候你可能想要在連續色板中使用不連續顏色,但是更通用的情況下是連續色板會作為顏色表在 kdeplot() 或者 corrplot() 或是一些 matplotlib 的函數中使用。
對於連續的數據,最好是使用那些在色調上有相對細微變化的調色板,同時在亮度和飽和度上有很大的變化。這種方法將自然地將數據中相對重要的部分成為關注點。
Color Brewer 的字典中就有一組很好的調色板。它們是以在調色板中的主導顏色(或顏色)命名的。
sns.palplot(sns.color_palette("Blues"))
就像在matplotlib中一樣,如果您想要翻轉漸變,您可以在面板名稱中添加一個_r后綴。
sns.palplot(sns.color_palette("BuGn_r"))
seaborn還增加了一個允許創建沒有動態范圍的"dark"面板。如果你想按順序畫線或點,這可能是有用的,因為顏色鮮艷的線可能很難區分。
sns.palplot(sns.color_palette("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_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()
with sns.color_palette("deep"): sinplot()