轉(zhuǎn)載于R語(yǔ)言中文論壇R語(yǔ)言中文社區(qū)
由于R語(yǔ)言基礎(chǔ)作圖部分內(nèi)容簡(jiǎn)單直接,但參數(shù)繁多,因此這里不做系統(tǒng)介紹,只挑出幾個(gè)點(diǎn)來(lái)講一講。主要介紹R中的顏色系統(tǒng)。
目錄
一個(gè)作圖示例
圖片的高清保存
par函數(shù)使用技巧
顏色系統(tǒng)
作圖使用中文亂碼
基礎(chǔ)作圖和數(shù)學(xué)公式的演示
一個(gè)作圖示例
下面我們要畫(huà)出以上圖片,當(dāng)做一些函數(shù)和參數(shù)使用的例子,代碼中的注釋會(huì)對(duì)一些內(nèi)容作出解釋。
x <- 1:5y <- 5:1# 生成25個(gè)點(diǎn)的網(wǎng)格數(shù)據(jù)xy <- expand.grid(y=y,x=x)# 畫(huà)25種pchplot(xy$x-6,xy$y,pch=1:25,col="red",cex=2, xlim=c(-5.5,6),ylim=c(-7,6), # 指定坐標(biāo)軸范圍 ann=F,axes=F) # 這兩個(gè)參數(shù)去掉原有邊框text(3-6,12,"points pch=")text(xy$x+0.4-6,xy$y,as.character(1:25))# 畫(huà)6種ltyfor(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))# 畫(huà)8種typea <- 1:3b <- -(1:3/4)typen <- c("h","p","l","b","o","S","s","n") # n指不畫(huà)線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)}# 畫(huà)通過(guò)原點(diǎn)的坐標(biāo)軸axis(1,c(-5,0,6),pos=0, # 確定軸的坐標(biāo)為0 col.ticks = "transparent",col="grey",col.axis="grey", hadj=-1,padj=-1.5) # 調(diào)整刻度名與軸之間的距離axis(2,c(-7,0,6),pos=0, col.ticks = "transparent",col="grey",col.axis="grey", hadj=1,padj=1.5)# 畫(huà)各種圖形segments(0.5,5,2.5,5,col=2) # 指定首尾坐標(biāo)text(6,5,"segments(1,5,3,5)",adj=1) # adj=1則文字最左端對(duì)應(yīng)前面指定的坐標(biāo)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) # 顏色可以設(shè)為無(wú)色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), # 自動(dòng)封閉填充顏色 col="grey",border=5) # 畫(huà)多邊形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之后手動(dòng)保存,一種是通過(guò)代碼命令保存。
通過(guò)代碼保存有如下兩個(gè)好處
如果一次要循環(huán)畫(huà)出多張圖片,同時(shí)保存下來(lái),通過(guò)代碼保存可以實(shí)現(xiàn)自動(dòng)化,大大減少工作量。
通過(guò)代碼保存還可以指定圖片清晰度。
代碼保存方式
保存圖片的命令分為兩個(gè)系統(tǒng)
png bmp jpeg tiff 函數(shù)是一類
pdf 函數(shù)是一類
這5個(gè)函數(shù)保存完的圖片都以函數(shù)名為后綴名。
函數(shù)的使用格式是這樣的
png("1.png",width=600,height=600) # 指明接下來(lái)要做的圖形的格式和長(zhǎng)寬plot(x,y)dev.off() # 關(guān)閉圖形設(shè)備
這樣做完圖,不會(huì)顯示在R語(yǔ)言窗口中,而是當(dāng)前文件夾中會(huì)出現(xiàn)一個(gè) 1.png 圖片。
清晰度說(shuō)明
pdf函數(shù)保存完是pdf格式,是一張矢量圖,放大縮小不影響清晰度,在使用latex時(shí),可以直接將其作為圖片導(dǎo)入pdf。
而很多時(shí)候?qū)雸D片不能使用pdf格式,只能用png等函數(shù),不過(guò)這些函數(shù)保存出來(lái)的圖片清晰度往往難以令人滿意。
下面我們就來(lái)說(shuō)一說(shuō)如何用png函數(shù)增加保存的圖片的清晰度。
我們要畫(huà)以下這張圖
下面是探索過(guò)程:
注釋1:最開(kāi)始我們嘗試將height和width同比例放大,發(fā)現(xiàn)圖很大文字很小。
注釋2:查看png函數(shù)的文檔,發(fā)現(xiàn)res參數(shù)可以改變像素,我們?cè)黾觬es試一試,發(fā)現(xiàn)文字很大,圖變小了小。而且res不能太大,否則就會(huì)報(bào)錯(cuò)。
目前代碼:我們把height width和res增大同樣比例試一試。發(fā)現(xiàn)圖片正常,而且清晰度提高了
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) # 注釋2png("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函數(shù)使用技巧
讀者看到上面的這兩條命令可能會(huì)覺(jué)得奇怪
opar <- par(mfrow=c(3,3))par(opar)
本來(lái)只要
par(mfrow=c(3,3))
全局設(shè)置一下就可以了,但是如果這樣的話,以后畫(huà)圖都會(huì)分成9宮格。使用上面那種形式是為了畫(huà)完圖還原之前的參數(shù),不影響后面的作圖。
除了par函數(shù),還有options函數(shù)也是如此
op <- options(digits = 2)(a <- 1.34556) # 1.3options(op)(a <- 1.34556) # 1.34556
顏色系統(tǒng)
一個(gè)展示顏色的程序
為了更方便地展示顏色,我們先定義一個(gè)展示顏色的函數(shù)showcolors,以后我們都會(huì)用這個(gè)函數(shù)來(lái)展示顏色。
# 默認(rèn)輸入顏色不超過(guò)10個(gè),放在一排排列展示,超過(guò)10個(gè)使用方格展示# 如果參數(shù)style="line"則放在一排排列展示,style="grid"則用方格顯示showcolors <- function(colors,style="two"){# 使用函數(shù)閉包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")},# 大量顏色使用方格顯示# 顏色向量的排列順序?yà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)# 參數(shù)選擇# 使用$或[[]]調(diào)用閉包函數(shù)switch(style, "line"=funv$showcol1(colors), "two"=funv[[ifelse(l<=10,"showcol1","showcols")]](colors), "grid"=funv$showcols(colors))}# 實(shí)例mycolor <- colors()[1:30]showcolors(mycolor)showcolors(mycolor,"line")
R語(yǔ)言顏色系統(tǒng)
調(diào)用顏色有一下幾種方法
使用顏色名稱
指定rgb或者用3位十六進(jìn)制數(shù)、或hsv
使用系統(tǒng)自帶顏色集
自己制作漸變色集
使用顏色包RColorBrewer包
使用數(shù)字
使用顏色名稱
使用字符串代表顏色,如 “red”,”black”等。這樣R語(yǔ)言自帶的可以使用的字符串共有657個(gè),具體顏色與名稱對(duì)應(yīng)見(jiàn)chart of r colors
# 用如下命令看顏色的演示demo("colors")# colors()代表一個(gè)長(zhǎng)為657的顏色字符串向量length(colors()) # 657colors()[30:35] # "blue4" "blueviolet" "brown" "brown1" "brown2" "brown3" # 當(dāng)你想得到多種紅色,可以用下面代碼colors()[grep("red",colors())]# 看看有哪些顏色(讀者自試)showcolors(colors()[grep("red",colors())])指定rgb或者用3位十六進(jìn)制數(shù)、或hsv如果系統(tǒng)自帶的顏色不令人滿意,我們可以自己指定顏色的rgb。rgb函數(shù)接的參數(shù)分別對(duì)應(yīng) r-red,g-green,b-blue,生成的顏色是由這三個(gè)顏色組成hsv 是Hue, Saturation, Value色調(diào)、飽和度、亮度。是繪圖的另外一套系統(tǒng)# 默認(rèn)三個(gè)數(shù)在0-1之間color <- rgb(1,0.5,0.25)# 由于我們平常使用的rgb都是0-255,我們可以這樣color <- rgb(35,255,76,maxColorValue=255)# 三個(gè)參數(shù)接向量可以做出一個(gè)顏色向量color <-rgb(seq(1,255,len=10),16:25,16:25,maxColorValue=255)showcolors(color)# 用rgb生成的函數(shù)以3個(gè)16進(jìn)制數(shù)的字符串表示# 我們平時(shí)去找顏色的時(shí)候,有時(shí)也能見(jiàn)到這種格式,其實(shí)和rgb是等價(jià)的,不過(guò)用起來(lái)更方便color[1:4] # "#011010" "#1D1111" "#391212" "#551313"# hsvmycolor <- hsv(seq(0,0.5,len=10),1:10/15,1:10/10)showcolors(mycolor)# 也是用十六進(jìn)制表示mycolor[1:4] # "#1A1818" "#332E2C" "#4D473D" "#66664B"# 提取顏色rgb數(shù)值col2rgb("yellow")
使用系統(tǒng)自帶顏色集
R有以下自帶顏色集
rainbow() 彩虹色
heat.colors() 紅色至黃色
terrain.colors() 綠色、棕色至白色
topo.colors() 深藍(lán)色至淺棕色
cm.colors() 淺藍(lán)到白色、淺紫色
gay()和grey() 灰色
前5個(gè)函數(shù)接受單個(gè)數(shù)值作為參數(shù),生成漸變色,數(shù)值越大,相鄰顏色差別越小
最后一個(gè)函數(shù)接受一個(gè)數(shù)值向量,數(shù)值為0-1之間
# 簡(jiǎn)單示例,作圖由讀者自試mycolor <- heat.colors(10)showcolors(mycolor)# fss中每一個(gè)元素作為fun的參數(shù),執(zhí)行fun函數(shù)的命令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函數(shù)接受參數(shù)的模式和三種不同showcolors(gray(1:30/30),"line")mtext("gray",side=3,line=-1)par(op)# 作圖結(jié)果見(jiàn)下方
自己制作漸變色集
自己制作漸變色可以使用rgb和hsv函數(shù),也可以使用下面一個(gè)函數(shù),指定顏色的漸變
# 下面函數(shù)可以建立從一個(gè)顏色到另一個(gè)顏色的漸變色a <- colorRampPalette(c("red", "purple"))showcolors(a(20),"line")# 可以接受多個(gè)顏色漸變a <- colorRampPalette(c("green","blue","red", "purple"))showcolors(a(40),"line")
使用顏色包RColorBrewer包
這個(gè)包中有三類顏色,個(gè)人認(rèn)為非常好看
seq類,漸變。適用于從低到高排序明顯的數(shù)據(jù),淺色數(shù)字小,深色數(shù)字大
div類,對(duì)對(duì)極值和中間值比較注重的數(shù)據(jù)
qual類,適用于分類
library(RColorBrewer)# 展示所有顏色display.brewer.all(type = "all") # type可以換為"qual","div","seq"# 使用顏色mycolors<-brewer.pal(7,"Set1") # 從這個(gè)色板中選擇7個(gè)顏色display.brewer.pal(n, "RdGy") # 展示這個(gè)調(diào)色板中的顏色brewer.pal.info # 查看有哪些調(diào)色板
使用數(shù)字
數(shù)字來(lái)表示顏色應(yīng)該是我們平時(shí)最常用的方法了,但是最后講,是因?yàn)樗婕暗秸{(diào)色板,我們可以將前面所有顏色放進(jìn)這個(gè)調(diào)色板中,定義自己的數(shù)字對(duì)應(yīng)顏色。所以等所有顏色都講完了才講這里。
數(shù)字對(duì)應(yīng)的顏色在調(diào)色板中,我們可以用 palette 調(diào)出查看,發(fā)現(xiàn)有8種默認(rèn)顏色,對(duì)應(yīng)數(shù)字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)
調(diào)色板的作用是便捷、快速地使用,我們可以對(duì)其進(jìn)行更改,使用我們自己喜歡的顏色。
# 讀者自己嘗試palette(rainbow(10))showcolors(1:10) mycolor <- colors()[1:30]palette(mycolor)showcolors(1:10)# 將調(diào)色板設(shè)回默認(rèn)palette("default")showcolors(1:10)
作圖使用中文亂碼
加載showtext包,詳情看 https://cos.name/2014/01/showtext-interesting-fonts-and-graphs
基礎(chǔ)作圖和數(shù)學(xué)公式的演示
demo(graphics)demo(plotmath)
聯(lián)系客服