數(shù)據(jù)科學(xué) IPython 筆記本 8.10 自定義顏色條

8.10 自定義顏色條

原文:Customizing Colorbars

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

本節(jié)是《Python 數(shù)據(jù)科學(xué)手冊》(Python Data Science Handbook)的摘錄。

繪圖圖例標(biāo)識離散點的離散標(biāo)簽买雾。對于基于點狮斗,線條或區(qū)域顏色的連續(xù)標(biāo)簽,帶標(biāo)簽的顏色條可能是一個很好的工具。在 Matplotlib 中葛菇,顏色條是一個單獨的軸域壶辜,可以為繪圖中的顏色含義提供見解。原書是黑白打印的铛漓,但是在線版本是彩色的溯香,你可以在這里看到全彩的圖形。我們首先為繪圖配置筆記本浓恶,并導(dǎo)入我們將使用的函數(shù):

import matplotlib.pyplot as plt
plt.style.use('classic')

%matplotlib inline
import numpy as np

我們在本節(jié)中多次看到玫坛,可以使用plt.colorbar函數(shù)創(chuàng)建最簡單的顏色條:

x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])

plt.imshow(I)
plt.colorbar();
png

我們現(xiàn)在將討論一些想法,自定義這些顏色條包晰,并在各種情況下有效地使用它們湿镀。

自定義顏色條

可以使用創(chuàng)建可視化的繪圖函數(shù)的cmap參數(shù)指定顏色條:

plt.imshow(I, cmap='gray');
png

所有可用的顏色表都在plt.cm命名空間中;IPython 的 TAB 補全伐憾,將為你提供內(nèi)置選項的完整列表:

plt.cm.<TAB>

但是能夠選擇顏色表只是第一步:更重要的是如何在選項中做決策勉痴!選擇結(jié)果比你最初預(yù)期的要微妙得多。

選擇顏色表

可視化中的顏色選擇的完全處理树肃,超出了本書的范圍蚀腿,但是為了閱讀這個主題和其他內(nèi)容,請參閱文章“更好的繪圖的十個簡單的規(guī)則”。Matplotlib 的在線文檔還有一個關(guān)于顏色表選擇的有趣討論莉钙。

一般來講廓脆,你應(yīng)該了解三種不同類型的顏色表:

  • 順序顏色表:它們由連續(xù)的顏色序列組成(例如,binaryviridis)磁玉。
  • 發(fā)散顏色表:這些通常包含兩種不同的顏色停忿,顯示相對均值的正偏差和負(fù)偏差(例如,RdBuPuOr)蚊伞。
  • 定性顏色表:這些混合顏色沒有特定的順序(例如席赂,rainbowjet)。

jet顏色表是 2.0 版之前 Matplotlib 中的默認(rèn)值时迫,是定性顏色表的一個示例颅停。它的默認(rèn)狀態(tài)非常不幸,因為對于表示定量數(shù)據(jù)來講掠拳,定性映射往往是不良選擇癞揉。問題之一是,定性映射通常在尺度增加時不顯示任何均勻的亮度變化溺欧。

我們可以通過將jet顏色表轉(zhuǎn)換成黑白來看到這一點:

from matplotlib.colors import LinearSegmentedColormap

def grayscale_cmap(cmap):
    """返回給定顏色表的灰度版本"""
    cmap = plt.cm.get_cmap(cmap)
    colors = cmap(np.arange(cmap.N))
    
    # 將 RGBA 轉(zhuǎn)換為感知灰度亮度
    # cf. http://alienryderflex.com/hsp.html
    RGB_weight = [0.299, 0.587, 0.114]
    luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight))
    colors[:, :3] = luminance[:, np.newaxis]
        
    return LinearSegmentedColormap.from_list(cmap.name + "_gray", colors, cmap.N)
    

def view_colormap(cmap):
    """使用顏色表的灰度等價物來繪制它"""
    cmap = plt.cm.get_cmap(cmap)
    colors = cmap(np.arange(cmap.N))
    
    cmap = grayscale_cmap(cmap)
    grayscale = cmap(np.arange(cmap.N))
    
    fig, ax = plt.subplots(2, figsize=(6, 2),
                           subplot_kw=dict(xticks=[], yticks=[]))
    ax[0].imshow([colors], extent=[0, 10, 0, 1])
    ax[1].imshow([grayscale], extent=[0, 10, 0, 1])

view_colormap('jet')
png

注意灰度圖像中的明亮條紋喊熟。即使是全彩色,這種不均勻的亮度意味著姐刁,眼睛會被吸引到顏色范圍的某些部分芥牌,這可能會強調(diào)數(shù)據(jù)集的不重要部分。最好使用例如viridis(Matplotlib 2.0 的默認(rèn)值)的顏色表聂使,它專門為在整個范圍內(nèi)具有均勻的亮度變化而構(gòu)建壁拉。因此,它不僅可以很好地適應(yīng)我們的色彩感知柏靶,而且可以很好地轉(zhuǎn)換為灰度打由壬獭:

view_colormap('viridis')
png

如果你喜歡彩虹圖案,連續(xù)數(shù)據(jù)的另一個良好選擇是cubehelix顏色表:

view_colormap('cubehelix')
png

對于其他情況宿礁,例如顯示某些均值的正偏差和負(fù)偏差案铺,諸如RdBu(Red-Blue)的雙色顏色表可能是有用的。但是梆靖,你會在下圖中看到控汉,重要的是要注意,在轉(zhuǎn)換為灰度時返吻,正負(fù)信息將會丟失姑子!

view_colormap('RdBu')
png

當(dāng)我們繼續(xù)時,我們將看到使用其中一些顏色表的示例测僵。

Matplotlib 中有大量的顏色表街佑;要查看它們的列表谢翎,可以使用 IPython 來探索plt.cm子模塊。對于在 Python 中使用顏色的更加合乎正道的途徑沐旨,你可以參考 Seaborn 庫中的工具和文檔(參見“使用 Seaborn 進行可視化”)森逮。

顏色限制和擴展

Matplotlib 允許定制大范圍的顏色條磁携。顏色條本身只是plt.Axes的一個實例闷供,所以我們學(xué)到的所有軸域和刻度的格式化技巧都適用粮呢。顏色條有一些有趣的靈活性:例如香璃,我們可以縮小顏色限制姻乓,并通過設(shè)置extend屬性,在頂部和底部用三角形箭頭指示越界值。這可能會派上用場,例如,如果顯示受噪聲影響的圖像:

# 為 1% 的圖像像素生成噪聲
speckles = (np.random.random(I.shape) < 0.01)
I[speckles] = np.random.normal(0, 3, np.count_nonzero(speckles))

plt.figure(figsize=(10, 3.5))

plt.subplot(1, 2, 1)
plt.imshow(I, cmap='RdBu')
plt.colorbar()

plt.subplot(1, 2, 2)
plt.imshow(I, cmap='RdBu')
plt.colorbar(extend='both')
plt.clim(-1, 1);
png

請注意溃蔫,在左側(cè)面板中,默認(rèn)顏色限制會響應(yīng)噪聲像素网沾,并且噪聲范圍會完全消除我們感興趣的模式桦山。在右側(cè)面板中钉凌,我們手動設(shè)置顏色限制捂人,并添加擴展來標(biāo)識高于或低于這些限制的值御雕。結(jié)果是對我們的數(shù)據(jù)更加有用的可視化。

離散顏色條

默認(rèn)情況下滥搭,顏色表是連續(xù)的酸纲,但有時你想表示離散值。最簡單的方法是使用plt.cm.get_cmap()函數(shù)瑟匆,并傳遞合適的顏色表的名稱以及所需的桶數(shù):

plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6))
plt.colorbar()
plt.clim(-1, 1);
png

顏色表的離散版本可以像任何其他顏色表一樣使用闽坡。

示例:手寫數(shù)字

對于這可能有用的示例,讓我們看一些手寫數(shù)字?jǐn)?shù)據(jù)的有趣可視化愁溜。
這些數(shù)據(jù)包含在 Scikit-Learn 中疾嗅,包含近 2,000 張8x8的縮略圖,顯示各種手寫數(shù)字祝谚。

現(xiàn)在宪迟,讓我們首先下載數(shù)字?jǐn)?shù)據(jù)并使用plt.imshow()可視化幾個示例圖像:

# 加載數(shù)字 0~5 的圖像
# 可視化它們中的幾個
from sklearn.datasets import load_digits
digits = load_digits(n_class=6)

fig, ax = plt.subplots(8, 8, figsize=(6, 6))
for i, axi in enumerate(ax.flat):
    axi.imshow(digits.images[i], cmap='binary')
    axi.set(xticks=[], yticks=[])
png

因為每個數(shù)字由其 64 個像素的亮度定義,我們可以將每個數(shù)字視為位于 64 維空間中的點:每個維度代表一個像素的亮度交惯。但是在這種高維空間中可視化關(guān)系可能非常困難次泽。解決這個問題的一種方法是使用降維技術(shù)穿仪,例如流形學(xué)習(xí),來減少數(shù)據(jù)的維度意荤,同時保持感興趣的關(guān)系啊片。降維是無監(jiān)督機器學(xué)習(xí)的一個例子,我們將在“什么是機器學(xué)習(xí)玖像?”中更詳細(xì)地討論它紫谷。

推遲對這些細(xì)節(jié)的討論,讓我們看一下這個數(shù)字?jǐn)?shù)據(jù)的二維流形學(xué)習(xí)投影(詳見“深入分析:流形學(xué)習(xí)”):

# 使用 IsoMap 將數(shù)字投影到二維
from sklearn.manifold import Isomap
iso = Isomap(n_components=2)
projection = iso.fit_transform(digits.data)

我們將使用我們的離散顏色表來查看結(jié)果捐寥,設(shè)置ticksclim來改善所得顏色條的美感:

# 繪制結(jié)果
plt.scatter(projection[:, 0], projection[:, 1], lw=0.1,
            c=digits.target, cmap=plt.cm.get_cmap('cubehelix', 6))
plt.colorbar(ticks=range(6), label='digit value')
plt.clim(-0.5, 5.5)
png

該投影還為我們提供了一些數(shù)據(jù)集內(nèi)部關(guān)系的有趣見解:例如笤昨,5 和 3 的范圍在此投影中幾乎重疊,表明一些手寫的五和三難以區(qū)分握恳,因此更容易由自動分類算法混淆瞒窒。其他值,如 0 和 1乡洼,更加分散崇裁,因此更不容易混淆。這個觀察結(jié)果與我們的直覺一致束昵,因為 5 和 3 看起來比 0 和 1 更相似拔稳。

我們將在第 5 章中返回流形學(xué)習(xí)和數(shù)字分類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锹雏,一起剝皮案震驚了整個濱河市巴比,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逼侦,老刑警劉巖匿辩,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰耙,死亡現(xiàn)場離奇詭異榛丢,居然都是意外死亡,警方通過查閱死者的電腦和手機挺庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門晰赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人选侨,你說我怎么就攤上這事掖鱼。” “怎么了援制?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵戏挡,是天一觀的道長。 經(jīng)常有香客問我晨仑,道長褐墅,這世上最難降的妖魔是什么拆檬? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮妥凳,結(jié)果婚禮上竟贯,老公的妹妹穿的比我還像新娘。我一直安慰自己逝钥,他們只是感情好屑那,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艘款,像睡著了一般持际。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哗咆,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天选酗,我揣著相機與錄音,去河邊找鬼岳枷。 笑死芒填,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的空繁。 我是一名探鬼主播殿衰,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盛泡!你這毒婦竟也來了闷祥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤傲诵,失蹤者是張志新(化名)和其女友劉穎凯砍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拴竹,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悟衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栓拜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座泳。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幕与,靈堂內(nèi)的尸體忽然破棺而出挑势,到底是詐尸還是另有隱情,我是刑警寧澤啦鸣,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布潮饱,位于F島的核電站,受9級特大地震影響诫给,放射性物質(zhì)發(fā)生泄漏香拉。R本人自食惡果不足惜饲漾,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缕溉。 院中可真熱鬧考传,春花似錦、人聲如沸证鸥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枉层。三九已至泉褐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸟蜡,已是汗流浹背膜赃。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揉忘,地道東北人跳座。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像泣矛,于是被迫代替她去往敵國和親疲眷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容