R可視化之圖形控制和佈局基礎

R語言的圖形參數主要由par()函數控制,圖形佈局主要由layout()函數控制

圖形參數

我們以如下數據爲例

劑量(dose) 對藥物A的響應(drugA) 對藥物B的響應(drugB)
20 16 15
30 20 18
40 27 25
45 40 31
60 60 40
dose  <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)

# par()函數作用是全局的,使用par()修改過的參數除非會話結束,否則將一直保留,之後畫
# 的圖形將一直使用修改過的參數繪製。
opar <- par(no.readonly=TRUE)  # 保存原始的par參數
par(lty=3,pch=8)    # 設置線型線寬
plot(dose,drugA,type='b')  # 繪製圖形
par(opar)  # 將參數恢復爲原始參數

# type='b'  表示同時繪製點和線
# type='p'  表示只繪製點
# type='l'  表示只繪製線
# type='o'  表示繪製的線穿過點
# type='c'  表示只繪製線且空出有點的地方(實際就是b模式把點去掉)

在這裏插入圖片描述

符號和線型線寬

參數 描述 默認值
lty 線條類型 solid(即1)
lwd 線條寬度 1
pch 設置繪圖點和符號的類型 1
cex 控制文字和繪圖符號的大小,cex=1表示正常大小,0.8表示正常大小的80% 1

參數pch對應的繪圖符號

# R中的線型和線寬
plot.new()
plot.window(xlim = c(0, 6), ylim =  c(0, 6), ann = F, asp = 1)
int <-  0:5+0.5
abline(h = int, lty = 1:6, lwd = 1:6)
text(1, int, paste(rep("lty = ", 6), 1:6, rep(", lwd = ", 6), 1:6), pos = 3)

在這裏插入圖片描述

plot(dose,drugA,type='b',lty=3,lwd=4,pch=15,cex=3)
#繪製一幅圖形,其線條類型爲點線,寬度爲默認寬度的4倍,點的符號爲實心正方形,大小爲默認符號大小的3倍

在這裏插入圖片描述

顏色

在R中,可以通過顏色下標、顏色名稱、十六進制的顏色值、RGB值或HSV值來指定顏色。舉例來說,col=1、col=“white”、col="#FFFFFF"、col=rgb(1,1,1) 和 col=hsv(0,0,1) 都是表示白色的等價方式.colors()可以返回所有可用的顏色。當需要連續的顏色時,可以使用rainbow()函數來生成。

參數 描述 默認值
col 默認的繪圖顏色。某些函數(如lines和pie)可以接受一個含有顏色值的向量並自動循環使用。例如,如果設定col=c(“red”, “blue”)並需要繪製三條線,則第一條線將爲紅色,第二條線爲藍色,第三條線又將爲紅色 ‘black’
col.axis 座標軸刻度文字的顏色 ‘black’
col.lab 座標軸標籤(名稱)的顏色 ‘black’
col.main 標題顏色 ‘black’
col.sub 副標題顏色 ‘black’
fg 圖形的前景色 ‘black’
bg 圖形的背景色 ‘white’
mycolors <- rainbow(5)   # 參數爲整數,表示要生成的顏色數量
pie(rep(1,5), labels=mycolors, col=mycolors)
mygrays <- gray(0:5/5)   # 生成 5階灰度色
pie(rep(1, 5), labels=mygrays, col=mygrays)

在這裏插入圖片描述

在這裏插入圖片描述

文本屬性

控制字號,字體, 字樣

參數 描述 默認值
cex 控制文字和繪圖符號的大小,cex=1表示正常大小,0.8表示正常大小的80% 1
cex.axis 座標軸刻度位子的縮放倍數 1
cex.lab 座標軸標籤(名稱)的縮放倍數 1
cex.main 主標題文字縮放倍數 1.2
cex.sub 副標題的縮放倍數 1
font 整數。用於指定繪圖使用的字體樣式。1=常規,2=粗體,3=斜體,4=粗斜體,5=符號字體(以Adobe符號編碼表示) 1
font.axis 座標軸刻度文字的字體樣式 1
font.lab 座標軸標籤的字體 1
font.main 主標題的字體 2
font.sub 副標題的字體樣式 1
ps 字體磅值(1磅約爲1/72英寸).文本的最終大小爲 ps*cex 12
family 繪製文本時使用的字體族。標準的取值爲serif(襯線)、sans(無襯線)和mono(等寬) ‘’
plot(dose,drugA,type='b',font.lab=2, cex.lab=1.5)  # 座標軸標籤字體斜體且放大1.5倍
text(dose-1,drugA+1,drugA,cex=0.8, font=4)  # 添加文本

在這裏插入圖片描述

圖形尺寸和邊界尺寸

參數 描述 默認值
pin 數值型向量c(寬,高),以英寸表示的圖形尺寸 (5.4,4.8)
mai 數值型向量 c(底部,左側,上方,右側),設置圖形邊距大小,單位英寸 c(1,0.8,0.8,0.4)+0.02
mar 數值型向量 c(底部,左側,上方,右側),設置圖形邊距大小,單位英分 c(5, 4, 4, 2) + 0.1
opar <- par(no.readonly=TRUE)
par(pin=c(2, 3),mfcol=c(1,2))
par(lwd=2, cex=1.5)
par(cex.axis=.75, font.axis=3)
plot(dose, drugA, type="b", pch=19, lty=2, col="red")
plot(dose, drugB, type="b", pch=23, lty=6, col="blue", bg="green")
par(opar)

在這裏插入圖片描述

添加文本,自定義座標軸和圖例

參數 描述 默認值
ann 控制高水平繪圖函數的主標題和座標軸標題註釋,若ann=FALSE,將不顯示這些註釋 TRUE
side 一個整數,表示在圖形的哪邊繪製座標軸(1=下,2=左,3=上,4=右)
at 一個數值型向量,表示需要繪製刻度線的位置
labels 一個字符型向量,表示置於刻度線旁邊的文字標籤(如果爲NULL,則將直接使用at中的值
pos 座標軸線繪製位置的座標(即與另一條座標軸相交位置的值)
las 標籤是否平行於(=0)或垂直於(=2)座標軸 0
tck 刻度線的長度,以相對於繪圖區域大小的分數表示(負值表示在圖形外側,正值表示在圖形內側,0表示禁用刻度,1表示繪製網格線);默認值爲-0.01)
xaxt 設置x軸類型,xaxt=“n” 表示沒有座標軸,取其它值都會畫出座標軸 s
yaxt 設置y軸類型,同上 s
plot(dose, drugA, type="b",  
     col="red", lty=2, pch=2, lwd=2,
     main="Clinical Trials for Drug A",     # 主標題
     sub="This is hypothetical data",     # 副標題
     xlab="Dosage", ylab="Drug Response",    # x,y軸標籤
     xlim=c(0, 60), ylim=c(0, 70))  #  x,y軸的範圍

在這裏插入圖片描述

在高級繪圖函數中,都是自帶座標軸標題等屬性的。如果想自定義,就要使用ann=FALSE 來禁用座標軸註釋

x <- c(1:10)
y <- x
z <- 10/x
opar <- par(no.readonly=TRUE)
par(mar=c(5, 4, 4, 8) + 0.1)  # 設置邊界大小
plot(x, y, type="b",
     pch=21, col="red",  # 設置符號類型及線顏色
     yaxt="n", lty=3, ann=FALSE)  # 關閉座標軸及座標軸註釋
lines(x, z, type="b", pch=22, col="blue", lty=2)  # 繪製 z線
axis(2, at=x, labels=x, col.axis="red", las=2)  # 繪製自定義x 軸
axis(4, at=z, labels=round(z, digits=2),   # 繪製自定義y軸
     col.axis="blue", las=2, cex.axis=0.7, tck=-.01)   
mtext("y=1/x", side=4, line=3, cex.lab=1, las=2, col="blue")   #座標軸標籤
title("An Example of Creative Axes",   # 標題
      xlab="X values",
      ylab="Y=X")
par(opar)

在這裏插入圖片描述

# 參考線

abline(h=c(1,2,3), v=(4,5,6))
# 在y軸1,2,3處,x軸4,5,6處添加參考線
# 圖例

legend(location,title,legend....)
參數 描述
location 有許多方式可以指定圖例的位置。你可以直接給定圖例左上角的x、y座標,也可以執行locator(1),然後通過鼠標單擊給出圖例的位置,還可以使用關鍵字bottom、bottomleft、left、topleft、top、topright、right、bottomright或center放置圖例。如果你使用了以上某個關鍵字,那麼可以同時使用參數inset=指定圖例向圖形內側移動的大小(以繪圖區域大小的分數表示)
title 圖例標題的字符串(可選)
legend 圖例標籤組成的字符型向量
其他選項。如果圖例標示的是顏色不同的線條,需要指定col=加上顏色值組成的向量。如果圖例標示的是符號不同的點,則需指定pch=加上符號的代碼組成的向量。如果圖例標示的是不同的線條寬度或線條類型,請使用lwd=或lty=加上寬度值或類型值組成的向量。要爲圖例創建顏色填充的盒形(常見於條形圖、箱線圖或餅圖),需要使用參數fill=加上顏色值組成的向量
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)    # 輸入數據
opar <- par(no.readonly=TRUE)    # 保存原始參數
par(lwd=2, cex=1.5, font.lab=2)    # 設置線寬, 放大1.5倍, 座標軸標籤字體 粗體
plot(dose, drugA, type="b",   
     pch=15, lty=1, col="red", ylim=c(0, 60),     # 設置符號類型,線型, 顏色, y軸取值範圍
     main="Drug A vs. Drug B",     # 主標題
     xlab="Drug Dosage", ylab="Drug Response")
text(dose-1, drugA+1.8, drugA, col='red',cex=0.5,font=2)    # 添加文本
text(dose, drugB-2, drugB, col='blue',cex=0.5,font=2)   # 添加文本
lines(dose, drugB, type="b",
      pch=17, lty=2, col="blue")
abline(h=c(30), lwd=1.5, lty=2, col="gray")    # 參考線
library(Hmisc)       # 載入包
minor.tick(nx=3, ny=3, tick.ratio=0.5)    # 添加次要刻度線
legend("topleft", inset=.05, title="Drug Type", c("A","B"),    # 圖例
       lty=c(1, 2), pch=c(15, 17), col=c("red", "blue"))
par(opar)

在這裏插入圖片描述

text()可向繪圖區域內部添加文本,而mtext()則向圖形的四個邊界之一添加文本。

參數 描述
location 文本的位置參數。可爲一對x,y座標,也可通過指定location爲locator(1)使用鼠標交互式地確定擺放位置
pos 文本相對於位置參數的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同時指定參數offset=作爲偏移量,以相對於單個字符寬度的比例表示
side 指定用來放置文本的邊。1=下,2=左,3=上,4=右。你可以指定參數line=來內移或外移文本,隨着值的增加,文本將外移。也可使用adj=0將文本向左下對齊,或使用adj=1右上對齊

text(lacation, “text”, pos,…)
mtext(“text”, side, line=n,…)

圖形佈局

使用layout()函數可以很容易的繪製出不同佈局的拼圖。
layout(mat,widthhs=rep.int(1,ncol(mat)), height=rep.int(1,nrow(mat)), respect=FALSE)

參數 描述
mat 矩陣,描述繪圖環境,比如matrix(c(1,2,3,3),nrow=2,ncol=2,byrow=TRUE)表示見繪圖區域分割成2行2列,按列填充。第三張圖佔據整個第二行,前兩張圖平分第一行
widths 向量,分割區域寬度,widths=(2,1)表示繪圖區寬度按照2:1劃分
heights 向量,分割區域高度,heights=(3,1)表示繪圖區高度按照3:1劃分
# 在par()函數中使用圖形參數 mfrow=c(nrows, ncols)來創建按行填充的、行數爲nrows、列數爲ncols的圖形矩陣。
# nfcol=c(nrows, ncols)按列填充矩陣

attach(mtcars)
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")
par(opar)
detach(mtcars)

在這裏插入圖片描述

# layout()函數
layout(matrix(c(1,2,3,3), nrow=2, ncol=2), widths=c(2,1))  # 設置佈局 2行2列 默認列填充, 第三幅圖佔據3,4號位,且寬度是1,2的1/2
opar <- par(no.readonly=TRUE)
par(mai=c(0.6,0.6,0.1,0.1),cex=0.7)      # 設置圖形邊距及縮放0.7
x <- rnorm(5000)    # 生成5000個標準正態分佈的隨機數
y <- rchisq(5000, 10)    # 生成5000個卡方分佈的隨機數
hist(x, prob=TRUE, col='lightblue',  # x 的直方圖,
     xlab='x', ylab='Density',  # 設置座標軸註釋
     ylim=c(0,0.4),main="")   # 設置y軸範圍,禁用主標題
hist(y, freq=FALSE, col='pink', xlab="y", ylab='Density', main="")
boxplot(x, col='red', lwd=1)
par(opar)

在這裏插入圖片描述

attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
       widths=c(3, 1), heights=c(1, 2))   # 第二行高度是第一行的2倍,第三幅圖的寬度是第二幅圖的 1/3
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)

在這裏插入圖片描述

#  更精細的控制圖形,可以使多張圖組合成一張有實際意義的圖形
#  利用 fig= 參數來精確的控制繪圖,參數fig=的取值是一個形如c(x1, x2, y1, y2)的數值向量
#  想想繪圖區域是一個寬爲 1 ,高爲 1 的矩形,則x1, x2, y1, y2的範圍就是[0,1]
#  fig= 默認 會新建一幅圖形,所以在添加一幅圖到一幅現有圖形上時,請設定參數new=TRUE。


opar <- par(no.readonly=TRUE)
par(fig=c(0, 0.8, 0, 0.8))    # 設置散點圖範圍
plot(mtcars$mpg, mtcars$wt,    #  散點圖
     xlab="Miles Per Gallon",
     ylab="Car Weight")
par(fig=c(0, 0.8, 0.5, 1), new=TRUE)   # 設置上方箱線圖範圍,寬於散點圖一致,高度範圍在0.5-1,。
boxplot(mtcars$mpg, horizontal=TRUE, axes=FALSE)   # 上方添加箱線圖, 禁用座標軸
par(fig=c(0.6, 1, 0, 0.8), new=TRUE)   # 設置右邊箱線圖,高度與散點圖一直,寬度範圍在0.6-1.
boxplot(mtcars$wt, axes=FALSE)    # 右邊添加箱線圖,禁用座標軸
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)
par(opar)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章