R語言繪圖、高清儲存、以及顏色系統
由於R語言基礎作圖部分內容簡單直接,但引數繁多,因此這裡不做系統介紹,只挑出幾個點來講一講。主要介紹R中的顏色系統。
目錄
-
一個作圖示例
-
圖片的高清儲存
-
par函式使用技巧
-
顏色系統
-
作圖使用中文亂碼
-
基礎作圖和數學公式的演示
一個作圖示例
下面我們要畫出以上圖片,當做一些函式和引數使用的例子,程式碼中的註釋會對一些內容作出解釋。
x <- 1:5 y <- 5:1 # 生成25個點的網格資料 xy <- expand.grid(y=y,x=x) # 畫25種pch plot(xy$x-6,xy$y,pch=1:25,col="red",cex=2, xlim=c(-5.5,6),ylim=c(-7,6), # 指定座標軸範圍 ann=F,axes=F) # 這兩個引數去掉原有邊框 text(3-6,12,"points pch=") text(xy$x+0.4-6,xy$y,as.character(1:25)) # 畫6種lty for(i in 1:6){ lines(1:5-6,rep(i*5/6,5)-7,lty=i,col="red",lwd=2) } text(3-6,6-7,"lines lty=") text(rep(5.35,6)-6,1:6*5/6-7,as.character(1:6)) # 畫8種type a <- 1:3 b <- -(1:3/4) typen <- c("h","p","l","b","o","S","s","n") # n指不畫線 for(i in 1:length(typen)){ points(a,b-0.8*i,type=typen[i],col=i+1) text(0.5,-0.2-0.8*i,typen[i],col=i+1) } # 畫通過原點的座標軸 axis(1,c(-5,0,6),pos=0, # 確定軸的座標為0 col.ticks = "transparent",col="grey",col.axis="grey", hadj=-1,padj=-1.5) # 調整刻度名與軸之間的距離 axis(2,c(-7,0,6),pos=0, col.ticks = "transparent",col="grey",col.axis="grey", hadj=1,padj=1.5) # 畫各種圖形 segments(0.5,5,2.5,5,col=2) # 指定首尾座標 text(6,5,"segments(1,5,3,5)",adj=1) # adj=1則文字最左端對應前面指定的座標 arrows(0.5,4,2.5,4,col=3) text(6,4,"arrows(1,5,3,5)",adj=1) rect(0.5,2.7,2.5,3.3,col="transparent",border=4) # 顏色可以設為無色 text(6,3,"rect(0.5,2.7,2.5,3.3)",adj=1) polygon(c(0.5,2.5,2.5,0.5),c(1.6,1.6,2.4,2.4), # 自動封閉填充顏色 col="grey",border=5) # 畫多邊形 text(6,2,"polygon",adj=1) legend("bottomright",c("segments","arrows","rect","polygon"), text.col=2:5,lty=1,pch=16,col=2:5,bg="grey",title="legend")
圖片的高清儲存
圖片儲存分為兩種,一種是plot之後手動儲存,一種是通過程式碼命令儲存。
通過程式碼儲存有如下兩個好處
-
如果一次要迴圈畫出多張圖片,同時儲存下來,通過程式碼儲存可以實現自動化,大大減少工作量。
-
通過程式碼儲存還可以指定圖片清晰度。
程式碼儲存方式
儲存圖片的命令分為兩個系統
-
png bmp jpeg tiff 函式是一類
-
pdf 函式是一類
這5個函式儲存完的圖片都以函式名為字尾名。
函式的使用格式是這樣的
png("1.png",width=600,height=600) # 指明接下來要做的圖形的格式和長寬 plot(x,y) dev.off() # 關閉圖形裝置
這樣做完圖,不會顯示在R語言視窗中,而是當前資料夾中會出現一個 1.png 圖片。
清晰度說明
pdf函式儲存完是pdf格式,是一張向量圖,放大縮小不影響清晰度,在使用latex時,可以直接將其作為圖片匯入pdf。
而很多時候匯入圖片不能使用pdf格式,只能用png等函式,不過這些函式儲存出來的圖片清晰度往往難以令人滿意。
下面我們就來說一說如何用png函式增加儲存的圖片的清晰度。
我們要畫以下這張圖
下面是探索過程:
-
註釋1:最開始我們嘗試將height和width同比例放大,發現圖很大文字很小。
-
註釋2:檢視png函式的文件,發現res引數可以改變畫素,我們增加res試一試,發現文字很大,圖變小了小。而且res不能太大,否則就會報錯。
-
目前程式碼:我們把height width和res增大同樣比例試一試。發現圖片正常,而且清晰度提高了
typei <- c("p","l","b","o","c","h","S","s","n") # png("type.png",width=600,height=600) # 原始程式碼 # png("type.png",width=600*3,height=3*600) # 註釋1 # png("type.png",width=600,height=600,res=72*2) # 註釋2 png("type.png",width=600*3,height=3*600,res=72*3) # pdf("type.pdf",height=14) opar <- par(mfrow=c(3,3)) for(i in 1:length(typei)){ plot(1:10,1:10,type=typei[i],xlab="",ylab="", main=paste('type="',typei[i],'"')) } dev.off()
par(opar)
par函式使用技巧
讀者看到上面的這兩條命令可能會覺得奇怪
opar <- par(mfrow=c(3,3)) par(opar)
本來只要
par(mfrow=c(3,3))
全域性設定一下就可以了,但是如果這樣的話,以後畫圖都會分成9宮格。使用上面那種形式是為了畫完圖還原之前的引數,不影響後面的作圖。
除了par函式,還有options函式也是如此
op <- options(digits = 2) (a <- 1.34556) # 1.3 options(op) (a <- 1.34556) # 1.34556
顏色系統
一個展示顏色的程式
為了更方便地展示顏色,我們先定義一個展示顏色的函式showcolors,以後我們都會用這個函式來展示顏色。
# 預設輸入顏色不超過10個,放在一排排列展示,超過10個使用方格展示 # 如果引數style="line"則放在一排排列展示,style="grid"則用方格顯示 showcolors <- function(colors,style="two"){ # 使用函式閉包 funv <- list( # 少量顏色展示,一排展示 showcol1 = function(color){ l1 <- seq_along(color) # 只要將顏色向量賦值給color,就能用柱狀圖展示 image(l1,1,as.matrix(l1),col=color, ylab="",xlab="",yaxt="n",xaxt="n",bty="n") }, # 大量顏色使用方格顯示 # 顏色向量的排列順序為,從上到下,從左到右排列 showcols = function(color){ l <- length(color) x <- ceiling(sqrt(l)) image(1:x,1:x,matrix(1:(x^2),nrow=x)[,x:1], col=c(color,rep(ifelse(is.character(color),"white",0),x^2-l)), ylab="",xlab="",yaxt="n",xaxt="n",bty="n") }) l <- length(colors) # 引數選擇 # 使用$或[[]]呼叫閉包函式 switch(style, "line"=funv$showcol1(colors), "two"=funv[[ifelse(l<=10,"showcol1","showcols")]](colors), "grid"=funv$showcols(colors) ) } # 例項 mycolor <- colors()[1:30] showcolors(mycolor) showcolors(mycolor,"line")
R語言顏色系統
-
呼叫顏色有一下幾種方法
-
使用顏色名稱
-
指定rgb或者用3位十六進位制數、或hsv
-
使用系統自帶顏色集
-
自己製作漸變色集
-
使用顏色包RColorBrewer包
-
使用數字
使用顏色名稱
使用字串代表顏色,如 “red”,”black”等。這樣R語言自帶的可以使用的字串共有657個,具體顏色與名稱對應見chart of r colors
# 用如下命令看顏色的演示 demo("colors") # colors()代表一個長為657的顏色字串向量 length(colors()) # 657 colors()[30:35] # "blue4" "blueviolet" "brown" "brown1" "brown2" "brown3" # 當你想得到多種紅色,可以用下面程式碼 colors()[grep("red",colors())] # 看看有哪些顏色(讀者自試) showcolors(colors()[grep("red",colors())]) 指定rgb或者用3位十六進位制數、或hsv 如果系統自帶的顏色不令人滿意,我們可以自己指定顏色的rgb。 rgb函式接的引數分別對應 r-red,g-green,b-blue,生成的顏色是由這三個顏色組成 hsv 是Hue, Saturation, Value色調、飽和度、亮度。是繪圖的另外一套系統 # 預設三個數在0-1之間 color <- rgb(1,0.5,0.25) # 由於我們平常使用的rgb都是0-255,我們可以這樣 color <- rgb(35,255,76,maxColorValue=255) # 三個引數接向量可以做出一個顏色向量 color <-rgb(seq(1,255,len=10),16:25,16:25,maxColorValue=255) showcolors(color) # 用rgb生成的函式以3個16進位制數的字串表示 # 我們平時去找顏色的時候,有時也能見到這種格式,其實和rgb是等價的,不過用起來更方便 color[1:4] # "#011010" "#1D1111" "#391212" "#551313" # hsv mycolor <- hsv(seq(0,0.5,len=10),1:10/15,1:10/10) showcolors(mycolor) # 也是用十六進位制表示 mycolor[1:4] # "#1A1818" "#332E2C" "#4D473D" "#66664B" # 提取顏色rgb數值 col2rgb("yellow")
使用系統自帶顏色集
R有以下自帶顏色集
-
rainbow() 彩虹色
-
heat.colors() 紅色至黃色
-
terrain.colors() 綠色、棕色至白色
-
topo.colors() 深藍色至淺棕色
-
cm.colors() 淺藍到白色、淺紫色
-
gay()和grey() 灰色
前5個函式接受單個數值作為引數,生成漸變色,數值越大,相鄰顏色差別越小
最後一個函式接受一個數值向量,數值為0-1之間
# 簡單示例,作圖由讀者自試 mycolor <- heat.colors(10) showcolors(mycolor) # fss中每一個元素作為fun的引數,執行fun函式的命令 fun <- function(f){ showcolors(do.call(f,list(30)),"line") mtext(f,side=3,line=-1) } fss <- c('rainbow','heat.colors','terrain.colors','topo.colors','cm.colors') op <- par(mfrow=c(3,2),mar=rep(0.2,4)) lapply(fss,fun) # gray函式接受引數的模式和三種不同 showcolors(gray(1:30/30),"line") mtext("gray",side=3,line=-1) par(op) # 作圖結果見下方
自己製作漸變色集
自己製作漸變色可以使用rgb和hsv函式,也可以使用下面一個函式,指定顏色的漸變
# 下面函式可以建立從一個顏色到另一個顏色的漸變色 a <- colorRampPalette(c("red", "purple")) showcolors(a(20),"line") # 可以接受多個顏色漸變 a <- colorRampPalette(c("green","blue","red", "purple")) showcolors(a(40),"line")
使用顏色包RColorBrewer包
這個包中有三類顏色,個人認為非常好看
-
seq類,漸變。適用於從低到高排序明顯的資料,淺色數字小,深色數字大
-
div類,對對極值和中間值比較注重的資料
-
qual類,適用於分類
library(RColorBrewer) # 展示所有顏色 display.brewer.all(type = "all") # type可以換為"qual","div","seq" # 使用顏色 mycolors<-brewer.pal(7,"Set1") # 從這個色板中選擇7個顏色 display.brewer.pal(n, "RdGy") # 展示這個調色盤中的顏色 brewer.pal.info # 檢視有哪些調色盤
使用數字
數字來表示顏色應該是我們平時最常用的方法了,但是最後講,是因為它涉及到調色盤,我們可以將前面所有顏色放進這個調色盤中,定義自己的數字對應顏色。所以等所有顏色都講完了才講這裡。
數字對應的顏色在調色盤中,我們可以用 palette 調出檢視,發現有8種預設顏色,對應數字1-8.
palette() # "black" "red" "green3" "blue" "cyan" "magenta" "yellow" "gray" op <- par(mfrow=c(1,2),mai=rep(0.2,4)) showcolors(1:8) showcolors(1:16) par(op)
調色盤的作用是便捷、快速地使用,我們可以對其進行更改,使用我們自己喜歡的顏色。
# 讀者自己嘗試 palette(rainbow(10)) showcolors(1:10) mycolor <- colors()[1:30] palette(mycolor) showcolors(1:10) # 將調色盤設回預設 palette("default") showcolors(1:10)
作圖使用中文亂碼
載入showtext包,詳情看 https://cos.name/2014/01/showtext-interesting-fonts-and-graphs
基礎作圖和數學公式的演示
demo(graphics) demo(plotmath)