[R包]R語言中的色彩和調色板

可視化數據時,色彩往往是最欠考慮的因素。的確,在一個圖中,數據的選擇和圖表類型的確定才是最重要,最需要確定的因素。但是,適當的選擇顏色不僅僅能使數據圖的閱讀者賞心悅目,而且有助于圖中數據關系的呈現,使得整個圖表更有說服力。這篇文章將簡單介紹R語言中的色彩和調色板相關package和函數。

一、R語言中的顏色與調色板

1 R語言中的顏色

R中可以通過定義col參數自定義顏色。參數的設置的四種方法是等價的:數字(如1代表當前palette的第1種顏色,2代表當前palette的第2種顏色等)、顏色名(如”red”,”blue”)、使用rgb()函數得到的返回值或者使用十六進制顏色代碼。這幾種設置方法是等價的,比如下例:

barplot(1:4, col = c(2, "red", rgb(1, 0, 0), "#FF0000"))

人們不禁要問,不同數字代表的都是什么顏色?通過palette()函數,可以看到在當前調色板下,第一種顏色是黑色,第二種顏色是紅色。這個調色板共有8種顏色,當使用顏色數大于8時,會從頭開始。

palette()

## [1] "black"? "red"? ? "green3"? "blue"? ? "cyan"? ? "magenta" "yellow"

## [8] "gray"

調色板當然是可以改變的,比如用系統中的彩虹調色板。此時,第二位可就不是紅色了。

palette(rainbow(12))

barplot(1:4, col = c(2, "red", rgb(1, 0, 0), "#FF0000"))

通過再次將palette設置為”default”,可以得到默認調色板。

palette("default")

可以看到,用數字來設置顏色非常簡單,但是可重復性比較差,可能會因為他人調色板設置的不同而導致顏色不一致。一般是在自己進行探索性數據分析時使用得比較多。

直接用顏色的英文來設置,則沒有上述問題。R中可以用英文設置的顏色有657個,可以通過colors()函數查看,或者直接運行demo(“colors”)看示例圖。不過我這等沒有美術基礎的色盲,用得多的還是最簡單的”red”,”green”,”blue”。

head(colors())

## [1] "white"? ? ? ? "aliceblue"? ? "antiquewhite"? "antiquewhite1"

## [5] "antiquewhite2" "antiquewhite3"

RGB函數接入三個取值[0,1]的數字,三個數字分別對應”red”,”green”,”blue”。所以在第一幅圖中,通過將”red”設為最大值1,”green”,”blue”設為最小值0,得到的結果就是紅色。rgb()函數中參數alpha是用來設置透明度的,對于特別密集的散點圖很常用。

barplot(1:3, col = c(rgb(1, 0, 0), rgb(0, 1, 0), rgb(0, 0, 1)))

其實rgb()函數返回的值就是十六進制顏色代碼。所以二者肯定可以換著使了。

rgb(1, 0, 0)

## [1] "#FF0000"

2 R語言中的調色板

調色板,簡單來說就是顏色的列表。其實在上一節中已經出現過一種調色板rainbow了。傳入數字12,獲得了12個彩虹顏色的顏色列表。傳入1000,可以的都下圖右側的彩虹轉盤。

par(mfrow = c(1, 2))

pie(rep(1, 12), col = rainbow(12), main = "rainbow12")

pie(rep(1, times = 1000), labels = "", col = rainbow(1000), border = rainbow(1000),

main = "rainbow1000")

R語言中除了自帶rainbow()調色板還有以下幾種:

par(mfrow = c(2, 2))

pie(rep(1, 12), col = heat.colors(12), main = "heat")

pie(rep(1, 12), col = terrain.colors(12), main = "terrain")

pie(rep(1, 12), col = topo.colors(12), main = "topo")

pie(rep(1, 12), col = cm.colors(12), main = "cm")

二、colorRamp()和colorRampPalette()

colorRamp()和colorRampPalette()都可用于建立顏色板。通過傳入希望的主要顏色如藍、紫,colorRamp()和colorRampPalette都返回一個函數。二者返回的函數區別為:colorRamp()返回的函數像grey()一樣,入參為[0,1]之間的數列,數列中數字個數即為函數返回的顏色板色彩數。colorRampPalette()返回的參數則像rainbow()一樣,入參為希望返回顏色板色彩的數量。而且通過下例可知,colorRampPalette()返回漸變顏色板函數,而colorRamp()返回對比顏色板函數。雖然都是用同樣的顏色,結果不同。

par(mfrow = c(1, 2))

b2p1 <- colorRampPalette(c("blue", "purple"))

b2p2 <- colorRamp(c("blue", "purple"))

pie(rep(1, 12), labels = "", col = b2p1(12), border = b2p1(12), main = "colorRampPalette")

pie(rep(1, 12), labels = "", col = b2p2(seq(0, 1, len = 12)), border = b2p2(seq(0,

1, len = 12)), main = "colorRamp")

三、RColorBrewer包

雖然說RColorBrewer包中實際用到的就只有brewer.pal()函數,但是包中的兩個優點使得其非常實用。一是,包中顏色板被劃分為序列型(sequential)、離散型(diverging)、分類型(qualitative)這三種基本能滿足統計作圖需要的類型;二是,顏色都比較協調。更多指引見其官網ColorBrewer。

require("RColorBrewer")

序列型顏色板適用于從低到高排序明顯的數據,淺色數字小,深色數字大。

display.brewer.all(type = "seq")

離散型顏色板適合帶“正、負”的,對極值和中間值比較注重的數據。

display.brewer.all(type = "div")

分類型顏色板比較適合區分分類型的數據。

display.brewer.all(type = "qual")

下面兩個圖是不是比默認顏色好看一些?再不好看的話只能靠自己的藝術細胞,或者從別人的圖片上找靈感了。比如說上次文章中寫到的從dribble網站上扒下來調色板顏色,可以回憶一下。有更高要求的同學可以參考哈佛的CS171可視化課程,用的是D3。

image(volcano, col = colorRampPalette(brewer.pal(9, "Purples"))(20), main = "volcano")

plot(iris$Petal.Length, iris$Petal.With, col = brewer.pal(3, "Set2")[iris$Species],

main = "iris")

分享到:

微信

微博

豆瓣

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容