1. 程式人生 > >R語言繪圖、高清儲存、以及顏色系統

R語言繪圖、高清儲存、以及顏色系統

由於R語言基礎作圖部分內容簡單直接,但引數繁多,因此這裡不做系統介紹,只挑出幾個點來講一講。主要介紹R中的顏色系統。

目錄

  1. 一個作圖示例

  2. 圖片的高清儲存

  3. par函式使用技巧

  4. 顏色系統

  5. 作圖使用中文亂碼

  6. 基礎作圖和數學公式的演示

一個作圖示例


下面我們要畫出以上圖片,當做一些函式和引數使用的例子,程式碼中的註釋會對一些內容作出解釋。

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之後手動儲存,一種是通過程式碼命令儲存。

通過程式碼儲存有如下兩個好處

  1. 如果一次要迴圈畫出多張圖片,同時儲存下來,通過程式碼儲存可以實現自動化,大大減少工作量。

  2. 通過程式碼儲存還可以指定圖片清晰度。

程式碼儲存方式

儲存圖片的命令分為兩個系統

  1. png bmp jpeg tiff 函式是一類

  2. 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語言顏色系統

  1. 呼叫顏色有一下幾種方法

  2. 使用顏色名稱

  3. 指定rgb或者用3位十六進位制數、或hsv

  4. 使用系統自帶顏色集

  5. 自己製作漸變色集

  6. 使用顏色包RColorBrewer包

  7. 使用數字

使用顏色名稱

使用字串代表顏色,如 “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有以下自帶顏色集

  1. rainbow() 彩虹色

  2. heat.colors() 紅色至黃色

  3. terrain.colors() 綠色、棕色至白色

  4. topo.colors() 深藍色至淺棕色

  5. cm.colors() 淺藍到白色、淺紫色

  6. 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包

這個包中有三類顏色,個人認為非常好看

  1. seq類,漸變。適用於從低到高排序明顯的資料,淺色數字小,深色數字大

  2. div類,對對極值和中間值比較注重的資料

  3. 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)