可視化數據時,色彩往往是最欠考慮的因素。
的確,在一個圖中,數據的選擇和圖表類型的確定才是最重要,最需要確定的因素。但是,適當的選擇顏色不僅僅能使數據圖的閱讀者賞心悅目,而且有助於圖中數據關係的呈現,使得整個圖表更有說服力。
這篇文章將簡單介紹R語言中的色彩和調色板相關package和函數。
一、R語言中的顏色與調色板1. R語言中的顏色R中可以通過定義col參數自定義顏色。
參數的設置的四種方法是等價的:
數字(如1代表當前palette的第1種顏色,2代表當前palette的第2種顏色等)這幾種設置方法是等價的,比如下例:
barplot(1:4,
col = c(1, "red", rgb(1, 0, 0), "#FF0000"))人們不禁要問,不同數字代表的都是什麼顏色?
通過palette()函數,可以看到在當前調色板下,第一種顏色是黑色,第二種顏色是紅色。這個調色板共有8種顏色,當使用顏色數大於8時,會從頭開始。
palette()
# [1] "black" "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC" "#F5C710" "gray62"調色板當然是可以改變的,比如用系統中的彩虹調色板。
此時第二位可就不是紅色了。
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" "antiquewhite2"
# [6] "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")本文直接來源自R友舍公眾號,原始來源不詳,如需複製我公號文章,排版請註明我公眾號來源,如不願意請複製原文,謝謝。