目錄
概況
常用高級(jí)圖形
條形圖
csv文件導(dǎo)入
csv文件導(dǎo)出
R語(yǔ)言sep函數(shù)
seq函數(shù)
with函數(shù)
直方圖和密度估計(jì)圖
盒型圖
boxplot()
正態(tài)QQ圖
散點(diǎn)圖
pairs()散點(diǎn)矩陣圖
曲線圖
curve()
三維圖
動(dòng)態(tài)三維圖
低級(jí)圖形函數(shù)
abline()
lines()
legand()增加圖例
axis()坐標(biāo)軸
text()給圖內(nèi)區(qū)域添加文字
locator()和identify()
圖形的參數(shù)
例子:用圖形參數(shù)解決barplot圖形橫坐標(biāo)值過寬
圖形元素控制
坐標(biāo)軸與坐標(biāo)刻度
圖形邊空
一頁(yè)多圖
圖形輸出
PDF輸出
PNG輸出
包含多種中文字體的圖形
其他圖形
相關(guān)系數(shù)圖
萬字帶你入門繪圖
概況
R語(yǔ)言的前身是S語(yǔ)言, S語(yǔ)言的設(shè)計(jì)目的就是交互式數(shù)據(jù)分析、繪圖。 所以繪圖是R的重要功能。
R有最初的基本繪圖, 這是從S語(yǔ)言繼承過來的, 還有一些功能更易用、更強(qiáng)大的繪圖系統(tǒng), 如lattice、ggplot2。 基本繪圖使用簡(jiǎn)單, 靈活性強(qiáng), 但是為了做出滿意的圖形需要比較多的調(diào)整。 這里先講解R語(yǔ)言的基本繪圖功能。
R的基本繪圖功能有兩類圖形函數(shù): 高級(jí)圖形函數(shù), 直接針對(duì)某一繪圖任務(wù)作出完整圖形; 低級(jí)圖形函數(shù),在已有圖形上添加內(nèi)容。 具備有限的與圖形交互的能力(函數(shù)locator 和identify)。
繪圖命令首先可以分成三個(gè)基本的類
- 高級(jí)繪圖命令在圖形設(shè)備上產(chǎn)生新的圖區(qū),它可能包括坐標(biāo)軸、標(biāo)簽、標(biāo)題等。plot(),hist()…
- 低級(jí)畫圖命令在已存在的圖上添加更多的圖形元素,如額外點(diǎn)、線和標(biāo)簽。 lines(),points(),legend(),title(),axis()…
常用高級(jí)圖形
條形圖
這里會(huì)大量碰到barplot函數(shù)的運(yùn)用,建議大家去這個(gè)博主的博客里看看,很詳細(xì).??barplot詳解
我們?cè)?code>d.cancer這個(gè)數(shù)據(jù)框存儲(chǔ)了肺癌病人放療的一些數(shù)據(jù),這些數(shù)據(jù)可以從以下文件讀入
cancer.csv
id age sex type v0 v1
1 70 F 腺癌 26.51 2.91
2 70 F 腺癌 135.48 35.08
3 69 F 腺癌 209.74 74.44
4 68 M 腺癌 61 34.97
5 67 M 鱗癌 237.75 128.34
6 75 F 腺癌 330.24 112.34
7 52 M 鱗癌 104.9 32.1
8 71 M 鱗癌 85.15 29.15
9 68 M 鱗癌 101.65 22.15
10 79 M 鱗癌 65.54 21.94
11 55 M 腺癌 125.31 12.33
12 54 M 鱗癌 224.36 99.44
13 55 F 腺癌 12.93 2.3
14 75 M 腺癌 40.21 23.96
15 61 F 腺癌 12.58 7.39
16 76 M 鱗癌 231.04 112.58
17 65 M 鱗癌 172.13 91.62
18 66 M 鱗癌 39.26 13.95
19 F 腺癌 32.91 9.45
20 63 F 腺癌 161 122.45
21 67 M 鱗癌 105.26 68.35
22 51 M 鱗癌 13.25 5.25
23 49 M 鱗癌 18.7 3.34
24 49 M 鱗癌 60.23 50.36
25 F 鱗癌 223 25.59
26 M 鱗癌 145.7 35.36
27 M 鱗癌 138.44 11.3
28 M 鱗癌 83.71 76.45
29 M 鱗癌 74.48 23.66
30 F 腺癌 42.7 5.97
31 M 鱗癌 142.48 68.46
32 F 鱗癌 46.97 27.32
33 F 鱗癌 170.63 74.76
34 F 鱗癌 67.37 54.52
csv文件導(dǎo)入
csv是最常用的數(shù)據(jù)源格式,具有通用性與普遍性,導(dǎo)入csv文件到R也有眾多方法。
- 方法1:使用Rstudio導(dǎo)入
在R中的右側(cè)pane中,有import dataset選項(xiàng),如果安裝了readr包,也提供了該包的圖形界面操作。操作簡(jiǎn)單,但是有個(gè)問題,如果csv格式路徑包含了中文,就會(huì)出現(xiàn)亂碼,然后無法導(dǎo)入。該方法對(duì)國(guó)內(nèi)用戶支持不友好,如果想用此法導(dǎo)入數(shù)據(jù)的話,只能把csv文件重命名并放至純英文的文件夾中。
- 方法2:內(nèi)置函數(shù)
R中內(nèi)置了讀入csv格式的函數(shù):read.csv函數(shù),該函數(shù)是由read.table函數(shù)改的特定函數(shù),使用逗號(hào)作為分隔符,同時(shí)header與fill這兩個(gè)參數(shù)默認(rèn)為TRUE。
#讀入csv文件 #把路徑換成自己的文件路徑 df <- read.csv("C:/Users/Administrator/Desktop/a文件.csv") #read.csv2,適用于小數(shù)點(diǎn)為“,”的csv文件 df <- read.csv2("C:/Users/Administrator/Desktop/b文件.csv") #小技巧,彈窗選擇文件 df <- read.csv(file.choose())
使用內(nèi)置函數(shù)導(dǎo)入csv文件,則不存在中文路徑的問題,同時(shí)還提供了導(dǎo)入以小數(shù)點(diǎn)為“,”的csv文件。對(duì)于單一csv文件,使用file.choose函數(shù)進(jìn)行圖形界面選擇,更加簡(jiǎn)單方便。
可能遇到的問題:導(dǎo)入中文csv文件,容易出現(xiàn)亂碼。
#中文亂碼處理 df <- read.csv( "C:/Users/Administrator/Desktop/a文件.csv", fileEncoding = "GBK", #指定文件的編碼 encoding = "GBK" #指定編碼 )
使用fileEncoding參數(shù)指定文件的編碼,能解決大部分導(dǎo)入出現(xiàn)中文亂碼的問題。如果導(dǎo)入后在R中顯示出現(xiàn)亂碼,增加encoding參數(shù)指定編碼,也能解決大部分問題。
- 方法3:使用readr包
readr包又是Hadley Wickham大神貢獻(xiàn)的R包之一,相比于內(nèi)置函數(shù),readr包讀入的速度更快。該包的函數(shù)與內(nèi)置函數(shù)相對(duì)應(yīng),并以read_XXX形式命名。
#readr包 df.readr <- read_csv("C:/Users/Administrator/Desktop/a文件.csv") #同樣提供讀入小數(shù)點(diǎn)為“,”的csv文件 df.readr <- read_csv2("C:/Users/Administrator/Desktop/a文件.csv")
readr包能夠自動(dòng)解析導(dǎo)入文件列的類型,這對(duì)于規(guī)整的數(shù)據(jù)來說很方便,但在我工作中,需要導(dǎo)入的文件常常有非法的字符,比如運(yùn)費(fèi)這一列,數(shù)據(jù)類型應(yīng)該為數(shù)值型,但經(jīng)常出現(xiàn)“--”這種字符串,表示無。readr包會(huì)將該值強(qiáng)制轉(zhuǎn)換為NA,在后續(xù)的處理中,新增計(jì)算列的時(shí)候,比如銷售總額 = 銷售額+運(yùn)費(fèi),則導(dǎo)致該值為NA,為了避免出現(xiàn)這類問題,我通常在導(dǎo)入數(shù)據(jù)的時(shí)候,設(shè)置為純文本導(dǎo)入,然后再做處理。
#設(shè)置純文本導(dǎo)入 df.readr <- read_csv( "C:/Users/Administrator/Desktop/a文件.csv", locale = locale(encoding = "GBK"), #指定編碼 col_types = cols(.default = col_character()) #純文本讀入 )
同樣的,如果出現(xiàn)中文亂碼,使用locale參數(shù)設(shè)置編碼。col_types參數(shù)設(shè)置各列的類型。
對(duì)于未知文件編碼的csv文件,readr包提供了一個(gè)函數(shù)來判斷文件編碼。
#判斷編碼 > guess_encoding("C:/Users/Administrator/Desktop/a文件.csv") # A tibble: 1 x 2 encoding confidence <chr> <dbl> 1 ASCII 1
返回一個(gè)數(shù)據(jù)框,encoding為文件編碼,confidence是該編碼的置信值,越高越有可能是這個(gè)編碼。
- 方法4:使用data.table包
data.table包是另一個(gè)處理數(shù)據(jù)的利器,對(duì)于GB級(jí)的數(shù)據(jù)更加高效。該包提供了一個(gè)函數(shù)讀入csv文件,相比于上面幾個(gè)方法,其速度是最快。
#data.table包 df.datatable <- fread("C:/Users/Administrator/Desktop/a文件.csv") #指定編碼 df.datatable <- fread("C:/Users/Administrator/Desktop/a文件.csv",encoding = "UTF-8")
fread函數(shù)提供的編碼很少,”UTF-8“,”Latin-1“,默認(rèn)是”unknown“,所以對(duì)中文的支持不太友好,在使用該函數(shù)的時(shí)候,建議把csv文件的編碼轉(zhuǎn)換為”UTF-8“。
csv文件導(dǎo)出
- 方法1:內(nèi)置函數(shù)
R提供了write.csv函數(shù)導(dǎo)出數(shù)據(jù),該函數(shù)也是write.table函數(shù)的特定版。
#導(dǎo)出文件 write.csv(df, file = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv") #與read.csv2對(duì)應(yīng) write.csv2(df, file = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv") #指定編碼 write.csv( df, file = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv", fileEncoding = "UTF-8" #導(dǎo)出文件編碼 )
- 方法2:readr包
與read_XX函數(shù)一樣,readr包提供write_XX函數(shù)。
#readr包 write_csv(df, path = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv") write_csv2(df, path = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv")
可惜的是,該系列函數(shù)不提供編碼,在我的工作中,使用sql server導(dǎo)入數(shù)據(jù)并處理后(在R中無亂碼情況),使用該函數(shù)導(dǎo)出數(shù)據(jù),中文會(huì)出現(xiàn)亂碼。原因不明,如果有哪位童靴知道的望告知。
為了解決上面的問題,我使用了該包的另一個(gè)函數(shù)。
#導(dǎo)出文件亂碼解決方法 write_excel_csv(df, path = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv")
改用此函數(shù)導(dǎo)出數(shù)據(jù),能夠解決上面中文亂碼的問題。
- 方法3:data.table包
data.table包也有對(duì)應(yīng)的導(dǎo)出函數(shù),同樣的,使用sql server導(dǎo)入的數(shù)據(jù),在導(dǎo)出的時(shí)候也出現(xiàn)了亂碼,而該函數(shù)也無參數(shù)指定編碼。
對(duì)于UTF-8編碼的文件,使用該函數(shù),速度是最快的。
#data.table包 fwrite(df, file = "C:/Users/Administrator/Desktop/導(dǎo)出文件.csv")
- readr包更為全面,推薦使用該包替換內(nèi)置函數(shù);
- data.table包速度最快,符合編碼且數(shù)據(jù)量大可優(yōu)先使用;
- Rstudio傻瓜式操作,但對(duì)中文不友好;
cancerData <- read.csv("cancer.csv",fileEncoding = "GBK", encoding = "GBK" )
注意:cancer.csv文件要放在主目錄下
我們統(tǒng)計(jì)出男女個(gè)數(shù)并且用條形圖來表示
res1 <- table(d.cancer[,'sex']); print(res1)
## sex
## F M
## 13 21
barplot(res1)
我們可以給表格增加標(biāo)題,然后采用不同的顏色
barplot(res1, main="性別分布", col=c("brown2", "aquamarine1"))
R函數(shù)colors()
可以返回R中定義的用字符串表示的六百多種顏色名字。 如head(colors(),6)
下面的函數(shù)可以用來挑選顏色, 鼠標(biāo)點(diǎn)擊畫出的顏色就可以挑選, 結(jié)果返回挑選出的顏色名:
select.colors <- function(){ nc <- length(colors()) x <- rep(seq(26), 26)[1:nc] y <- rep(seq(26), each=26)[1:nc] cols <- colors() plot(x, y, type="p", pch=16, cex=2, col=cols) res <- cols[identify(x,y, labels=cols)] res }
R語(yǔ)言sep函數(shù)
函數(shù)形式:rep(x, time = , length = , each = ,)
參數(shù)說明:
x:代表的是你要進(jìn)行復(fù)制的對(duì)象,可以是一個(gè)向量或者是一個(gè)因子。
times:代表的是復(fù)制的次數(shù),只能為正數(shù)。負(fù)數(shù)以及NA值都會(huì)為錯(cuò)誤值。復(fù)制是指的是對(duì)整個(gè)向量進(jìn)行復(fù)制。
each:代表的是對(duì)向量中的每個(gè)元素進(jìn)行復(fù)制的次數(shù)。
length.out:代表的是最終輸出向量的長(zhǎng)度。
示例:
rep(1:4, 2) #對(duì)向量(1,2,3,4)復(fù)制兩次
[1] 1 2 3 4 1 2 3 4
rep(1:4, each = 2) #對(duì)向量(1,2,3,4)中的每個(gè)元素復(fù)制兩次
[1] 1 1 2 2 3 3 4 4
rep(1:4, each = 2, length.out = 4) #最后輸出向量的長(zhǎng)度為4
[1] 1 1 2 2
rep(x, …):將vector x的值循環(huán)n遍
rep(1:4, 2)
[1] 1 2 3 4 1 2 3 4
…: 除了x的其他參數(shù),可以通過…傳到其他方法里
times:整個(gè)數(shù)組循環(huán)幾遍
rep(1:4, each = 2, times = 3)
[1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
each:每個(gè)element循環(huán)幾遍
rep(1:4, each = 2) [1] 1 1 2 2 3 3 4 4 rep(1:4, c(2,2,2,2)) [1] 1 1 2 2 3 3 4 4 rep(1:4, c(2,1,2,1)) [1] 1 1 2 3 3 4
length.out 輸出長(zhǎng)度為多少
rep(1:4, each = 2, len = 4) [1] 1 1 2 2 #長(zhǎng)了會(huì)被截掉 rep(1:4, each = 2, len = 13) [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 #短了會(huì)根據(jù)前面規(guī)則補(bǔ)上
seq函數(shù)
seq()函數(shù)是產(chǎn)生等距間隔數(shù)列的函數(shù),其使用格式為:
seq(from = 1, to = 1,by = ((to - from)/(length.out - 1)) ,length.out= NULL, length.out = NULL,...)
seq()函數(shù)中參數(shù)的名稱、取值及意義
名稱 取值及意義??
from 數(shù)值,表示等間隔數(shù)列開始的位置,默認(rèn)值為1
to 數(shù)值,表示等間隔數(shù)列結(jié)束的位置,默認(rèn)值為1
by 數(shù)值,表示等間隔數(shù)列之間的間隔
length.out 數(shù)值,表示等間隔數(shù)列的長(zhǎng)度
along.out 向量,表示產(chǎn)生的等間隔數(shù)列與向量具有相同的長(zhǎng)度
注意:by, length.out 和along.with 3個(gè)參數(shù)只能輸入一項(xiàng)。
> seq(0,1,length.out=11) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(1,9,by=2) [1] 1 3 5 7 9
> seq(1,9,by=pi) [1] 1.000000 4.141593 7.283185
> seq(10) [1] 1 2 3 4 5 6 7 8 9 10
我們運(yùn)行了上述代碼之后可以看到我們可以自行選擇顏色
點(diǎn)擊完兩個(gè)顏色記得在命令行輸入界面按esc退出,才可以顯示出這個(gè)表格圖
用width選項(xiàng)與xlim選項(xiàng)配合可以調(diào)整條形寬度,如
barplot(res1, width=0.5, xlim=c(-3, 5), main="性別分布", col=c("brown2", "aquamarine1"))
xlim可以用于plot函數(shù)作圖,它的意思是xlim = c(<min>, <max>)。就是說縮放函數(shù)的x軸,范圍在min與max之間。
經(jīng)過我不斷的試驗(yàn),我發(fā)現(xiàn)F占據(jù)x軸的0位置,M占據(jù)x軸的1位置
hhh
按性別與病理類型交叉分組后統(tǒng)計(jì)頻數(shù),結(jié)果稱為列聯(lián)表:??
res2 <- with(cancerData, table(sex, type)); res2
with函數(shù)
with()R語(yǔ)言中的函數(shù)用于通過評(píng)估函數(shù)參數(shù)內(nèi)的表達(dá)式來修改 DataFrame 的數(shù)據(jù)。
用法: with(x, expr)
參數(shù):
x: DataFrame
expr:修改數(shù)據(jù)的表達(dá)式
范例1:
# R program to modify data of an object # Calling predefined data set BOD # Calling with() function with(BOD, {BOD$demand <- BOD$demand + 1; print(BOD$demand)})
輸出:
Time demand 1 1 8.3 2 2 10.3 3 3 19.0 4 4 16.0 5 5 15.6 6 7 19.8 [1] 9.3 11.3 20.0 17.0 16.6 20.8
范例2:
# R program to modify data of an object # Creating a data frame df = data.frame( "Name" = c("abc", "def", "ghi"), "Language" = c("R", "Python", "Java"), "Age" = c(22, 25, 45) ) df # Calling with() function with(df, {df$Age <- df$Age + 10; print(df$Age)})
輸出:
Name Language Age 1 abc R 22 2 def Python 25 3 ghi Java 45 [1] 32 35 55
用分段條形圖表現(xiàn)交叉分組頻數(shù), 交叉頻數(shù)表每列為一條:
barplot(res2, legend=TRUE)
這里的legend的意思就是需不需要加上標(biāo)簽名,
用并排條形圖表現(xiàn)交叉分組頻數(shù), 交叉頻數(shù)表每列為一組:
barplot(res2, beside=TRUE, legend=TRUE)
增加標(biāo)題,指定顏色,調(diào)整圖例位置,調(diào)整條形寬度:
barplot(res2, beside=TRUE, legend=TRUE, main='不同種類病人的性別', ylim=c(0, 20), xlim=c(-1, 6), width=0.6, col=c("brown2", "aquamarine1"))
直方圖和密度估計(jì)圖
用hist
作直方圖以了解連續(xù)取值變量分布情況.
例如,下面的程序模擬正態(tài)分布數(shù)據(jù)并做直方圖:
x <- rnorm(30, mean=100, sd=1) print(round(x,2))
round函數(shù)
R 語(yǔ)言提供了一個(gè)內(nèi)置函數(shù) round(),它四舍五入到給定的位數(shù),如果沒有提供四舍五入的位數(shù),它會(huì)將數(shù)字四舍五入到最接近的整數(shù)。
用法:round(x,digits=n)
參數(shù):
x:要四舍五入的數(shù)字
digit:指定數(shù)字
范例1:
# R program to calculate round value # Using round() method answer1 <- round(2.356) answer2 <- round(2.356, digits = 2) answer3 <- round(2.5) answer4 <- round(2.5, digits = 1) print(answer1) print(answer2) print(answer3) print(answer4)
輸出:
2
2.36
2
2.5
范例2:
# R program to calculate round value # Using round() method answer1 <- round(c(1.5, 2.6, -3, -3.4)) print(answer1)
輸出:2 3 -3 -3
了解了round函數(shù)是怎么用的之后,我們回歸上面的代碼
x <- rnorm(30, mean=100, sd=1) print(round(x,2))
hist(x)
可以用main=、xlab=、ylab=等選項(xiàng), 可以用col=指定各個(gè)條形的顏色,如:
hist(x, col=rainbow(15), main='正態(tài)隨機(jī)數(shù)', xlab='', ylab='頻數(shù)')
函數(shù)density()估計(jì)核密度。 下面的程序作直方圖, 并添加核密度曲線:
tmp.dens <- density(x) hist(x, freq=FALSE, ylim=c(0,max(tmp.dens$y)), col=rainbow(15), main='正態(tài)隨機(jī)數(shù)', xlab='', ylab='頻數(shù)') lines(tmp.dens, lwd=2, col='blue')
density核密度
關(guān)于density作圖詳細(xì)教程建議大家看這篇博客??R語(yǔ)言中density密度圖繪制,這篇文章是用的ggplot2的package
盒型圖
首先帶大家介紹以下boxplot()函數(shù)
boxplot()
盒形圖是數(shù)據(jù)集中數(shù)據(jù)分布情況的衡量標(biāo)準(zhǔn)。它將數(shù)據(jù)集分為三個(gè)四分位數(shù)。盒形圖表示數(shù)據(jù)集中的最小值,最大值,中值,第一四分位數(shù)和第四四分位數(shù)。 通過為每個(gè)數(shù)據(jù)集繪制箱形圖,比較數(shù)據(jù)集中的數(shù)據(jù)分布也很有用。
R中的盒形圖通過使用boxplot()函數(shù)來創(chuàng)建。
語(yǔ)法
在R中創(chuàng)建盒形圖的基本語(yǔ)法是
boxplot(x, data, notch, varwidth, names, main)
以下是使用的參數(shù)的描述 -
- x - 是向量或公式。
- data - 是數(shù)據(jù)幀。
- notch - 是一個(gè)邏輯值,設(shè)置為TRUE可以畫出一個(gè)缺口。
- varwidth - 是一個(gè)邏輯值。設(shè)置為true以繪制與樣本大小成比例的框的寬度。
- names - 是將在每個(gè)箱形圖下打印的組標(biāo)簽。
- main - 用于給圖表標(biāo)題。
示例
我們用一個(gè)數(shù)據(jù)集 mtcars來創(chuàng)建一個(gè)基本的盒型圖
下面我們首先看看mtcars數(shù)據(jù)集中的mpg和cyl列
input <- mtcars[,c('mpg','cyl')] print(head(input))
注:這個(gè)數(shù)據(jù)集是R語(yǔ)言中已經(jīng)存在的,大家可以直接利用
當(dāng)我們執(zhí)行上面的代碼,它產(chǎn)生以下結(jié)果??
> print(head(input)) mpg cyl Mazda RX4 21.0 6 Mazda RX4 Wag 21.0 6 Datsun 710 22.8 4 Hornet 4 Drive 21.4 6 Hornet Sportabout 18.7 8 Valiant 18.1 6
創(chuàng)建盒型圖
下面的腳本將為mgp(每加侖英里)和cyl(氣缸數(shù))列之間的關(guān)系創(chuàng)建一個(gè)盒型圖.
# Give the chart file a name. png(file = "boxplot.png") # Plot the chart. boxplot(mpg ~ cyl, data = mtcars, xlab = "氣缸數(shù)", ylab = "每加侖里程", main = "里程數(shù)據(jù)") # Save the file. dev.off()
盒型圖與凹口
我們可以繪制帶有凹槽的盒形圖,以了解不同數(shù)據(jù)組的中位數(shù)如何相互匹配。以下腳本將為每個(gè)數(shù)據(jù)組創(chuàng)建一個(gè)帶有凹槽的盒形圖形。
# Give the chart file a name. png(file = "boxplot_with_notch.png") #這個(gè)圖片文件將存放在你的工作目錄 # Plot the chart. boxplot(mpg ~ cyl, data = mtcars, xlab = "氣缸數(shù)", ylab = "每加侖里程", main = "里程數(shù)據(jù)", notch = TRUE, varwidth = TRUE, col = c("green","yellow","purple"), names = c("高","中","低") ) # Save the file. dev.off()
OK,學(xué)會(huì)了boxplot的基本運(yùn)用,我們來看一些其他的運(yùn)用
盒型圖用于簡(jiǎn)潔得查看表現(xiàn)變量分布,如??
with(cancerData, boxplot(v0))
其中中間粗線是中位數(shù), 盒子上下邊緣是四分之三和四分之一分位數(shù), 兩條觸須線延伸到取值區(qū)域的邊緣。
盒形圖可以很容易地比較兩組或多組,如??
with(cancerData, boxplot(v0 ~ sex))
也可以畫若干個(gè)變量的并排盒形圖,如??
with(cancerData, boxplot(list('療前'=v0, '療后'=v1)))
正態(tài)QQ圖
QQ圖是一種散點(diǎn)圖,對(duì)應(yīng)于正態(tài)分布的QQ圖,就是由標(biāo)準(zhǔn)正態(tài)分布的分位數(shù)為橫坐標(biāo),樣本值為縱坐標(biāo)的散點(diǎn)圖(其他版本,有將 (x-m)/std 作為縱坐標(biāo),那么正態(tài)分布得到的散點(diǎn)圖是直線:y=x)。要利用QQ圖鑒別樣本數(shù)據(jù)是否近似于正態(tài)分布,只需看QQ圖上的點(diǎn)是否近似地在一條直線附近,圖形是直線說明是正態(tài)分布,而且該直線的斜率為標(biāo)準(zhǔn)差,截距為均值,用QQ圖還可獲得樣本偏度和峰度的粗略信息。
如果樣本是按正態(tài)分布的,那么f(x)即是一個(gè)正態(tài)分布的概率密度函數(shù)。根據(jù)正態(tài)分布的特性,我們又可以推導(dǎo)出對(duì)應(yīng)的標(biāo)準(zhǔn)正態(tài)分布的概率密度函數(shù):y = f( (x-m)/std )
其中m為樣本均值(截距),std為樣本標(biāo)準(zhǔn)差(斜率)。
設(shè)標(biāo)準(zhǔn)正態(tài)分布的概率密度函數(shù)為 y= f(n),既然這些值一一對(duì)應(yīng),則有:
(x-m)/std=n
即:x=n*std+m
這是一條斜率為樣本標(biāo)準(zhǔn)差,截距為m的直線,就是在q-q圖中代表著正態(tài)分布的直線。
用qqnorm和qqline作正態(tài)QQ圖。 當(dāng)變量樣本來自正態(tài)分布總體時(shí), 正態(tài)QQ圖的散點(diǎn)近似在一條直線周圍。
下面的程序模擬正態(tài)分布隨機(jī)數(shù),并作正態(tài)QQ圖:
qqnorm(x) qqline(x, lwd=2, col='blue')
下面的程序模擬對(duì)數(shù)正態(tài)數(shù)據(jù),并作正態(tài)QQ圖:
z <- 10^rnorm(30, mean=0, sd=0.2) qqnorm(z) qqline(z, lwd=2, col='blue')
散點(diǎn)圖
我們讀入class.csv,以d.class數(shù)據(jù)為例,其中含有name,sex,age,height,weight等變量.
d.class <- read.csv("class.csv")
class.csv
體重對(duì)身高的散點(diǎn)圖
plot(d.class$height,d.class$weight)
接下來我們用with()函數(shù)來簡(jiǎn)化數(shù)據(jù)框變量的訪問格式
with(d.class,plot(height,weight))
得出的圖跟上面一張圖是一樣的
我們?cè)趐lot()函數(shù)內(nèi)用main參數(shù)來增加一個(gè)標(biāo)題
用xlab參數(shù)來指定橫軸標(biāo)注,用ylab參數(shù)指定縱軸標(biāo)注,如:
with(d.class, plot(height,weight, main = '體重與身高關(guān)系', xlab='身高',ylab='體重'))
然后我們?cè)儆胮ch參數(shù)來指定不同散點(diǎn)形狀,用col參數(shù)來指定顏色,用cex參數(shù)指定大小,如下??
with(d.class,plot( height,weight,pch=16,col='blue', cex=2 ))
我們?nèi)绻麑ch改為15的話,圖上的點(diǎn)就會(huì)變成正方形
用氣泡大小表現(xiàn)第三維(年齡):
with(d.class, plot(height, weight, pch=16, col='blue', cex=1 + (age - min(age))/(max(age)-min(age))))
用氣泡大小表現(xiàn)年齡, 用顏色區(qū)分性別:
with(d.class, plot(height, weight, main='體重與身高關(guān)系', xlab='身高', ylab='體重', pch=16, col=ifelse(sex=='M', 'blue', 'red'), cex=1 + (age - min(age)) /(max(age)-min(age))))
這里我用select自己選了兩個(gè)顏色,代碼在上面已經(jīng)展示過了
pairs()散點(diǎn)矩陣圖
pairs(d.class[, c('age', 'height', 'weight')])
曲線圖
curve()
curve 函數(shù)常用于繪制函數(shù)對(duì)應(yīng)的曲線,確定函數(shù)的表達(dá)式,以及對(duì)應(yīng)的需要展示的起始坐標(biāo)和終止坐標(biāo),curve函數(shù)就會(huì)自動(dòng)化的繪制在該區(qū)間內(nèi)的函數(shù)圖像
基本用法,代碼示例:
curve(sin, -2*pi, 2*pi)
第一個(gè)參數(shù)為函數(shù)的名稱,這里我們選擇的是sin 三角函數(shù),后兩個(gè)參數(shù)為對(duì)應(yīng)的起始和終止區(qū)間
下面詳細(xì)解釋一下每個(gè)參數(shù):
1) expr : 對(duì)應(yīng)的函數(shù)名稱,這個(gè)參數(shù)的值可以有3中寫法:
第一種: 函數(shù)的名稱
代碼示例:
# y = 2x + 1 coef_line <- function(x){ 2 * x + 1 } curve(expr = coef_line, from = 1, to = 3)
這里我們先定義了一個(gè)函數(shù)coef_line , 然后將函數(shù)名稱傳遞給curve
第二種:expression
代碼示例:
curve(expr = 2 * x + 1, from = 2 , to = 6)
這里的2 * x + 1 就是一個(gè)表達(dá)式 expression
第三種: call, 函數(shù)調(diào)用
代碼示例:
# y = 2x + 1 coef_line <- function(x){ 2 * x + 1 } x <- 1:5 curve(expr = coef_line(x), from = 2, to = 6)
效果圖和上面的是一樣的
這里我們調(diào)用函數(shù)coef_line 去處理x 這個(gè)對(duì)象
2)from, to : 自變量x的起始和終止位置,這個(gè)用法很簡(jiǎn)單,就不詳細(xì)解釋了
3)xname : x 軸的標(biāo)簽, 這里參數(shù)只有當(dāng)傳遞進(jìn)來的是函數(shù)名稱時(shí),才能運(yùn)行
代碼示例:
# y = 2x + 1 coef_line <- function(x){ 2 * x + 1 } curve(expr = coef_line, from = 2, to = 6, xname = "X Var")
curve()函數(shù)接收一個(gè)函數(shù),或者一個(gè)以x為變量的表達(dá)式,以及曲線的自變量的左右端點(diǎn),繪制函數(shù)或者表達(dá)式的曲線圖,如:
curve(1 - 3*x - x^2, -4 ,2)
又比如
curve(sin,-2*pi ,2*pi)
這里再為大家詳細(xì)得介紹一下plot函數(shù)的運(yùn)用
plot()函數(shù)
plot是R中的基本畫圖工具,直接plot(x),x為一個(gè)數(shù)據(jù)集,就能畫出圖。細(xì)節(jié)往往制勝的關(guān)鍵,所以就詳細(xì)來看下plot的所有可設(shè)置參數(shù)及參數(shù)設(shè)置方法。
下面講到的圖形參數(shù),是graphic包中的常見參數(shù),graphic不同圖形方法中,這些參數(shù)都是相同的。
- 符號(hào)和線條
pch指定圖形(在type=”p”/”o”/”b”時(shí))
可加cex參數(shù),用來控制圖中的符號(hào)大小,默認(rèn)為cex=1
當(dāng)PCH為21-25時(shí),應(yīng)指定參數(shù)“col =”和“bg =”。PCH也可以是字符,例如“?!保埃ァ?,“A”,“a”,并且字符將被繪制
lty指定線形;lwd改變線條粗細(xì)??
- type圖形的類型
“p”點(diǎn)圖
“l(fā)”線圖
“b”點(diǎn)線圖,線不穿過點(diǎn)
“c”虛線圖
“o”點(diǎn)線圖,線穿過點(diǎn)
“h”直方圖
“s”階梯圖
“S”步驟圖
“n”無圖
x<-c(1:10) png("~/plotSamples.png",width=9,height=9,unit="in",res=108) #在工作目錄下創(chuàng)建plotSamples.png圖 par(mfcol=c(3,3))#下面會(huì)講到 plot(x,type="p",main="p") plot(x,type="l",main="l") plot(x,type="b",main="b") plot(x,type="c",main="c") plot(x,type="o",main="o") plot(x,type="h",main="h") plot(x,type="s",main="s") plot(x,type="S",main="S") plot(x,type="n",main="n") dev.off()
- 顏色
col:默認(rèn)繪圖顏色。某些函數(shù)(如lines、pie)可以接受一個(gè)含有顏色值的向量,并自動(dòng)循環(huán)使用.
例如:col=c("red", "blue")需要繪制三條線,那么三條顏色分別為red、blue、red
col.axis:坐標(biāo)軸刻度文字的顏色,不是坐標(biāo)軸的顏色
col.lab:坐標(biāo)軸標(biāo)簽(名稱)的顏色
col.main:標(biāo)題的顏色
col.sub:副標(biāo)題的顏色
fg:圖形的前景色
bg:圖形的背景色
col指定圖形顏色
colors()方法可以查看R中所有可用的顏色名,一共有657種顏色名,根據(jù)顏色名可直接設(shè)置圖形的顯示顏色。下面是部分顏色,完整的圖見鏈接:R語(yǔ)言顏色表
除了名稱外,同樣可以用下標(biāo),十六進(jìn)制顏色值,RGB值和HSV值來指定顏色。例子:col=1、col="white"、col="#FFFFFF"、col=rgb(1,1,1)和col=hsv(0,0,1)。
另外,R中還有許多生成顏色變量的函數(shù)。有rainbow()、heat.colors()、terrain.colors()、topo.colors()、cm.colors()方法,gray()方法生成多階灰度色。
我們?cè)趐lot函數(shù)中使用type='l'參數(shù)也可以作曲線圖,比如
x <- seq(0, 2*pi, length=200) y <- sin(x) plot(x,y, type='l')
除了這些,還可以用main, xlab, ylab, col等參數(shù), 用lwd指定線寬度, lty指定虛線,如
plot(x,y, type='l', lwd=5, lty=8)
如果有多條曲線的話,我們可以用matplot()函數(shù),比如
x <- seq(0, 2*pi, length=200) y1 <- sin(x) y2 <- cos(x) matplot(x, cbind(y1, y2), type='l', lty=1, lwd=2, col=c("red", "blue"), xlab="x", ylab="") abline(h=0, col='gray')
abline()函數(shù)
abline 函數(shù)的作用是在一張圖表上添加直線, 可以是一條斜線,通過x或y軸的交點(diǎn)和斜率來確定位置;也可以是一條水平或者垂直的線,只需要指定與x軸或y軸交點(diǎn)的位置就可以了
常見用法:
1)添加直線
水平線:
通過h 參數(shù)設(shè)置直線與y軸的交點(diǎn)就可以了,代碼示例如下:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(h = 0, col = "red")
垂直線:
通過v 參數(shù)設(shè)置直線與x軸的交點(diǎn)就可以了,代碼示例如下:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(v = 0, col = "blue")
除了上述的基本用法之外,h和v參數(shù)還支持同時(shí)設(shè)置多個(gè)值,一次性可以畫多條直線,代碼示例如下:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(h = c(0,1,2), v = c(0,1,2), col = c("red", "green", "blue"))
2)添加斜線
abline 函數(shù)添加斜線有兩種用法:
第一種分別指定交點(diǎn)和斜率的值,參數(shù) a 代表直線與y軸的交點(diǎn)距坐標(biāo)原點(diǎn)的位置,參數(shù) b 代表斜率, 代碼示例如下:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(h = 0, col = "gray") abline(v = 0, col = "gray") abline(a = 1 , b = 1, col = "red") abline(a = 2 ,b = 1, col = "blue")
第二種通過一個(gè)長(zhǎng)度為2的向量同時(shí)指定交點(diǎn)與原點(diǎn)的距離和斜率,代碼示例如下:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(h = 0, col = "gray") abline(v = 0, col = "gray") abline(coef = c(1, 1), col = "red") abline(coef = c(2, 1), col = "blue")
對(duì)于線條來說,有許多的屬性,比如顏色,線條類型,線條粗細(xì)等,在abline 函數(shù)中也是可以對(duì)這些屬性進(jìn)行設(shè)置的
- col : 線條的顏色
- lty : 線條的類型
- lwd : 線條的寬度
這些屬性的設(shè)置都很簡(jiǎn)單,舉一個(gè)例子:
plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6)) abline(v = 0, col = "gray", lwd = 2, lty = 2)
上述的都是基本用法,其實(shí)還有一種用法,可以添加一條回歸線,對(duì)于一元線性回歸來說,回歸表達(dá)式就是一條直線的公式,abline 函數(shù)可以直接利用回歸結(jié)果進(jìn)行作圖
代碼如下:
z <- lm(dist ~ speed, data = cars) plot(cars) abline(z)
curve的運(yùn)用
curve(expr, from = NULL, to = NULL, n = 101, add = FALSE, type = "l", xname = "x", xlab = xname, ylab = NULL, log = NULL, xlim = NULL, ...)
主要參數(shù)如下:
expr:函數(shù)名稱或一個(gè)關(guān)于變量x的函數(shù)表達(dá)式;
from,to:表示繪圖的起止范圍;
n:一個(gè)整數(shù)值,表示x取值的數(shù)量;
add:是一個(gè)邏輯值,當(dāng)為TRUE時(shí),表示將繪圖添加到已存在的繪圖中;
type:與plot函數(shù)中type含義相同;
xname:用于x軸變量的名稱。
xlab,ylab:x軸和y軸的標(biāo)簽名稱。
三維圖
用persp函數(shù)作三維曲面圖, contour作等值線圖, image作色塊圖。 坐標(biāo)x和y構(gòu)成一張平面網(wǎng)格, 數(shù)據(jù)z是包含z坐標(biāo)的矩陣,每行對(duì)應(yīng)一個(gè)橫坐標(biāo), 每列對(duì)應(yīng)一個(gè)縱坐標(biāo)。
下面的程序生成二元正態(tài)分布密度曲面數(shù)據(jù):
x <- seq(-3,3, length=100) y <- x f <- function(x,y,ssq1=1, ssq2=2, rho=0.5){ det1 <- ssq1*ssq2*(1 - rho^2) s1 <- sqrt(ssq1) s2 <- sqrt(ssq2) 1/(2*pi*sqrt(det1)) * exp(-0.5 / det1 * ( ssq2*x^2 + ssq1*y^2 - 2*rho*s1*s2*x*y)) } z <- outer(x, y, f)
作二元正態(tài)密度函數(shù)的三維曲面圖、等高線圖、色塊圖:
persp(x, y, z)
三維曲面圖:??
等高線圖:
contour(x, y, z)
色塊圖:??
image(x,y,z)
動(dòng)態(tài)三維圖
rgl包能夠制作動(dòng)態(tài)的三維散點(diǎn)圖和曲面圖
library(rgl)
iris數(shù)據(jù)框包含了3種鳶尾花的各50個(gè)樣品的測(cè)量值, 測(cè)量值包括花萼長(zhǎng)、寬, 花瓣長(zhǎng)、寬。 用rgl的plot3d()作動(dòng)態(tài)三維散點(diǎn)圖如下:
with(iris, plot3d( Sepal.Length, Sepal.Width, Petal.Length, type="s", col=as.numeric(Species)))
這個(gè)圖可以用鼠標(biāo)拖動(dòng)旋轉(zhuǎn)。 其中type="s"表示繪點(diǎn)符號(hào)是球體形狀。 還可選"p"(點(diǎn))、"l"(連線)、"h"(向z=0連線)。 可以用size=指定大小倍數(shù)(缺省值為3)。
用rgl的persp3d()函數(shù)作曲面圖。 如 二元正態(tài)分布密度曲面:
x <- seq(-3,3, length=100) y <- x f <- function(x,y,ssq1=1, ssq2=2, rho=0.5){ det1 <- ssq1*ssq2*(1 - rho^2) s1 <- sqrt(ssq1) s2 <- sqrt(ssq2) 1/(2*pi*sqrt(det1)) * exp(-0.5 / det1 * ( ssq2*x^2 + ssq1*y^2 - 2*rho*s1*s2*x*y)) } z <- outer(x, y, f) persp3d(x=x, y=y, z=z, col='red')
rgl也有低級(jí)圖形函數(shù)支持向已有圖形添加物體、文字等, 也支持并列多圖。 適當(dāng)設(shè)置可以在R Markdown生成的HTML結(jié)果中動(dòng)態(tài)顯示三維圖。
低級(jí)圖形函數(shù)
abline()
上面為了方便理解已經(jīng)介紹過一次
用points函數(shù)增加散點(diǎn),如:
x <- seq(0, 2*pi, length=200) y <- sin(x) special <- list(x=(0:4)*pi/2, y=sin((0:4)*pi/2)) plot(x, y, type='l') points(special$x, special$y, col="red", pch=16, cex=2) points(special, col="red", pch=16, cex=2)
lines()
用lines函數(shù)增加曲線,如:
x <- seq(0, 2*pi, length=200) y1 <- sin(x) y2 <- cos(x) plot(x, y1, type='l', lwd=2, col="red") lines(x, y2, lwd=2, col="blue") abline(h=0, col='gray')
legand()增加圖例
可以用legend函數(shù)增加標(biāo)注,如:
x <- seq(0, 2*pi, length=200) y1 <- sin(x) y2 <- cos(x) plot(x, y1, type='l', lwd=2, col="red") lines(x, y2, lwd=2, col="blue") abline(h=0, col='gray') legend(0, -0.5, col=c("red", "blue"), lty=c(1,1), lwd=c(2,2), legend=c("sin", "cos"))
x <- seq(0, 2*pi, length=200) y1 <- sin(x) y2 <- cos(x) plot(x, y1, type='l', lwd=2, col="red") lines(x, y2, lwd=2, col="blue") abline(h=0, col='gray') legend('top', col=c("red", "blue"), lty=c(1,1), lwd=c(2,2), legend=c("sin", "cos"))
axis()坐標(biāo)軸
在plot()函數(shù)中用 axes=FALSE可以取消自動(dòng)的坐標(biāo)軸。 用box()函數(shù)畫坐標(biāo)邊框。 用axis函數(shù)單獨(dú)繪制坐標(biāo)軸。 axis的第一個(gè)參數(shù)取1,2,3,4, 分別表示橫軸、縱軸、上方和右方。 axis的參數(shù)at為 刻度線位置,labels為標(biāo)簽。 如:
x <- c('一月'=15, '二月'=20, '三月'=18, '四月'=22) plot(seq(along=x), x, axes=FALSE, type='b', lwd=3, main='前四個(gè)月銷售額', xlab='', ylab='銷售額') box(); axis(2) axis(1, at=seq(along=x), labels=names(x))
R基本繪圖支持少量的數(shù)學(xué)公式顯示功能,如不用數(shù)學(xué)符號(hào)時(shí):
x <- seq(0, 2*pi, length=200) y1 <- sin(x) plot(x, y1, type='l', lwd=2, axes=FALSE, xlab='x', ylab='') abline(h=0, col='gray') box() axis(2) axis(1, at=(0:4)/2*pi, labels=c('0', 'pi/2', 'pi', '3pi/2', '2pi'))
使用數(shù)學(xué)符號(hào)時(shí):
x <- seq(0, 2*pi, length=200) y1 <- sin(x) plot(x, y1, type='l', lwd=2, axes=FALSE, xlab='x', ylab='') abline(h=0, col='gray') box() axis(2) axis(1, at=(0:4)/2*pi, labels=c(0, expression(pi/2), expression(pi), expression(3*pi/2), expression(2*pi)))
繪圖中使用數(shù)學(xué)符號(hào)的演示:
demo(plotmath)
text()給圖內(nèi)區(qū)域添加文字
text()在坐標(biāo)區(qū)域內(nèi)添加文字。 mtext()在邊空處添加文字。 如
with(d.class, plot(height, weight)) lm1 <- lm(weight ~ height, data=d.class) abline(lm1, col='red', lwd=2) a <- coef(lm1)[1] b <- coef(lm1)[2] text(52, 145, adj=0, '線性回歸:') text(52, 140, adj=0, substitute(hat(y) == a + b*x, list(a=round(coef(lm1)[1], 2), b=round(coef(lm1)[2], 2))))
locator()和identify()
locator()函數(shù)在執(zhí)行時(shí)等待用戶在圖形的坐標(biāo)區(qū)域內(nèi)點(diǎn)擊并返回點(diǎn)擊處的坐標(biāo)。 可以用參數(shù)n指定要點(diǎn)擊的點(diǎn)的個(gè)數(shù)。 不指定個(gè)數(shù)則需要用右鍵菜單退出。 這個(gè)函數(shù)也可以用來要求用戶點(diǎn)擊以進(jìn)行到下一圖形。
x <- seq(0, 2*pi, length=200) y1 <- sin(x); y2 <- cos(x) plot(x, y1, type='l', col="red") lines(x, y2, col="blue") legend(locator(1), col=c("red", "blue"), lty=c(1,1), legend=c("sin", "cos"))
identify()可以識(shí)別點(diǎn)擊處的點(diǎn)并標(biāo)注標(biāo)簽, 格式為identify(x, y, labels), 其中(x,y)給出可點(diǎn)擊的點(diǎn)的坐標(biāo), labels是每個(gè)點(diǎn)對(duì)應(yīng)的標(biāo)簽, 點(diǎn)擊那個(gè)點(diǎn)就在那個(gè)點(diǎn)旁邊標(biāo)對(duì)應(yīng)的標(biāo)簽。
圖形的參數(shù)
用圖形參數(shù)可以選擇點(diǎn)的形狀、顏色、線型、粗細(xì)、坐標(biāo)軸做法、邊空、一頁(yè)多圖等。 有些參數(shù)直接用在繪圖函數(shù)內(nèi),如plot函數(shù)可以用 pch、col、cex、lty、 lwd等參數(shù)。 有些圖形參數(shù)必須使用par()函數(shù)指定。 par函數(shù)指定圖形參數(shù)并返回原來的參數(shù)值, 所以在修改參數(shù)值作圖后通常應(yīng)該恢復(fù)原始參數(shù)值, 做法如
opar <- par(mfrow=c(2,2)) with(d.class, {hist(height); boxplot(height); qqnorm(height); qqline(height); plot(height); rug(height,side=2)})
par(opar)
在函數(shù)內(nèi),可以在函數(shù)開頭修改了圖形參數(shù)后, 用on.exit()函數(shù)將恢復(fù)原始圖形參數(shù)作為函數(shù)退出前必須完成的任務(wù),如
f <- function(){ opar <- par(mfrow=c(2,2)); on.exit(par(opar)) with( d.class, {hist(height); boxplot(height); qqnorm(height); qqline(height); plot(height); rug(height,side=2) }) } f()
例子:用圖形參數(shù)解決barplot圖形橫坐標(biāo)值過寬
barplot的橫坐標(biāo)標(biāo)注太寬時(shí),自動(dòng)將某些標(biāo)注省略。 用las=2指定坐標(biāo)軸刻度標(biāo)簽垂直于坐標(biāo)軸, 這樣x軸的刻度值就變成了縱向的。 注意使用mar參數(shù)增加橫坐標(biāo)邊空大小。 例如
f <- function(){ opar <- par(mar=c(8, 4, 2, 0.5)); on.exit(par(opar)) x <- 1:10 names(x) <- paste(10000000000 + (1:10)) barplot(x, las=2) } f()
圖形元素控制
- pch=16參數(shù)。散點(diǎn)符號(hào),取的數(shù)。
- lty=2參數(shù)。線型,1為實(shí)線,從2開始為各種虛線。
- lwd=2參數(shù),線的粗細(xì),標(biāo)準(zhǔn)粗細(xì)為1。
- col="red"參數(shù),顏色,可以是數(shù)字, 或顏色名字符串如"red","blue"等。 用colors()函數(shù)查詢有名字的顏色。 用rainbow(n)函數(shù)產(chǎn)生連續(xù)變化的顏色。
- font=2參數(shù),字體,一般font=1是正體,2是粗體, 3是斜體,4是粗斜體。
- adj=-0.1指定文本相對(duì)于給定坐標(biāo)的對(duì)齊方式。 取0表示左對(duì)齊,取1表示右對(duì)齊,取0.5表示居中。 此參數(shù)的值實(shí)際代表的是出現(xiàn)在給定坐標(biāo)左邊的文本的比例。
- cex=1.5 繪點(diǎn)符號(hào)大小倍數(shù),基本值為1。
坐標(biāo)軸與坐標(biāo)刻度
- mgp=c(3,1,0) 坐標(biāo)軸的標(biāo)簽、刻度值、坐標(biāo)軸線 到實(shí)際的坐標(biāo)軸位置的距離,以行高為單位。 經(jīng)常用來縮小坐標(biāo)軸所占的空間, 如mgp=c(1.5, 0.5, 0)。
- lab=c(5,7,12) 提供刻度線多少的建議, 第一個(gè)數(shù)為x軸刻度線個(gè)數(shù), 第二個(gè)數(shù)為y軸刻度線個(gè)數(shù), 第三個(gè)數(shù)是坐標(biāo)刻度標(biāo)簽的字符寬度。
- las=1 坐標(biāo)刻度標(biāo)簽的方向。 0表示總是平行于坐標(biāo)軸, 1表示總是水平, 2表示總是垂直于坐標(biāo)軸。
- tck=0.01 坐標(biāo)軸刻度線長(zhǎng)度,以繪圖區(qū)域大小為單位1。
- xaxs="s", yaxs="e": 控制x軸和y軸標(biāo)刻度的方法。取"s"(即standard)或"e"(即extended) 的時(shí)候數(shù)據(jù)范圍控制在最小刻度和最大刻度之間。 取"e"時(shí)如果有數(shù)據(jù)點(diǎn)十分靠近邊緣軸的范圍會(huì)略微擴(kuò)大。取值為"i"(即internal)或"r"(此為缺?。?使得刻度線都落在數(shù)據(jù)范圍內(nèi)部,而"r"方式所留的邊空較小。取值設(shè)為"d"時(shí)會(huì)鎖定此坐標(biāo)軸, 后續(xù)的圖形都使用與它完全相同的坐標(biāo)軸, 這在要生成一系列可比較的圖形的時(shí)候是有用的。 要解除鎖定需要把這個(gè)圖形參數(shù)設(shè)為其它值。
圖形邊空
一個(gè)單獨(dú)的圖由繪圖區(qū)域(繪圖的點(diǎn)、線等畫在這個(gè)區(qū)域中)和包圍繪圖區(qū)域的邊空組成, 邊空中可以包含坐標(biāo)軸標(biāo)簽、坐標(biāo)軸刻度標(biāo)簽、標(biāo)題、小標(biāo)題等, 繪圖區(qū)域一般被坐標(biāo)軸包圍。
邊空的大小由mai參數(shù)或mar參數(shù)控制, 它們都是四個(gè)元素的向量, 分別規(guī)定下方、左方、上方、右方的邊空大小, 其中mai取值的單位是英寸, 而mar的取值單位是文本行高度。 例如:
邊空的大小由mai參數(shù)或mar參數(shù)控制, 它們都是四個(gè)元素的向量, 分別規(guī)定下方、左方、上方、右方的邊空大小, 其中mai取值的單位是英寸, 而mar的取值單位是文本行高度。 例如:
opar <- par(mar=c(2,2,0.5,0.5), mgp=c(0.5, 0.5, 0), tck=0.005) with(d.class, plot(height, weight, xlab='', ylab=''))
par(opar)
一頁(yè)多圖
R可以在同一頁(yè)面開若干個(gè)按行、列排列的窗格, 在每個(gè)窗格中可以作一幅圖。 每個(gè)圖有自己的內(nèi)邊空, 而所有圖的外面可以包一個(gè)“外邊空”。
一頁(yè)多圖用mfrow參數(shù)或mfcol參數(shù)規(guī)定。 用oma指定四個(gè)外邊空的行數(shù)。 用mtext加outer=T指定在外邊空添加文本。 如果沒有outer=T則在內(nèi)邊空添加文本。 如
opar <- par(mfrow=c(2,2), oma=c(0,0,2,0)) with(d.class, {hist(height); boxplot(height); qqnorm(height); qqline(height); plot(height); rug(height,side=2)}) mtext(side=3, text='身高分布', cex=2, outer=T)
par(opar)
圖形輸出
只要啟用了高級(jí)繪圖函數(shù)會(huì)自動(dòng)選用當(dāng)前繪圖設(shè)備, 缺省為屏幕窗口。
PDF輸出
用pdf函數(shù)可以指定輸出到PDF文件。如
pdf(file='fig-hw.pdf', height=10/2.54, width=10/2.54, family='GB1') with(d.class, plot(height, weight, main='體重與身高關(guān)系')) dev.off()
用dev.off()關(guān)閉當(dāng)前設(shè)備并生成輸出文件 (如果是屏幕窗口則沒有保存結(jié)果)。
PNG輸出
png(file='fig-hw.png', height=1000, width=1000) with(d.class, plot(height, weight, main='體重與身高關(guān)系')) dev.off()
類似地, 用jpeg()函數(shù)啟用JPEG圖形設(shè)備, 用bmp()函數(shù)啟用BMP圖形設(shè)備, 用postscript()函數(shù)啟用PostScript圖形設(shè)備。
包含多種中文字體的圖形
為了使用MS Windows系統(tǒng)字體, 一種辦法是安裝showtext包。 該包替換畫圖時(shí)的添加文本函數(shù)命令, 把文本內(nèi)容替換成多邊形(PDF或PS圖)或點(diǎn)陣(點(diǎn)陣圖)。
需要的工作:
- 查看Windows的font目錄內(nèi)容,看文件名與字體名的對(duì)應(yīng)關(guān)系。 下面的程序中的列表是我的中文Windows 10的部分中文字體。
- 找到自己希望使用的中文字體的文件名。
- 用font.add()命令,增加一套自定義字體family, 一套中可以指定四種:常規(guī)(regular), 粗體(bold), 斜體(italic), 粗斜體(bolditalic)
- 程序中調(diào)入showtext包并運(yùn)行showtext.auto()命令,這個(gè)命令使得文本命令采用showtext包
- 用par(family=)指定自定義的字體family。
- 作圖(主要是PDF)。關(guān)閉圖形設(shè)備。
test.chinese <- function(){ require(showtext); showtext.auto() ## 建立文件名到字體名對(duì)照表 fmap <- c( 'msyh'='微軟雅黑常規(guī)', 'msyhbd'='微軟雅黑粗體', 'msyhl'='微軟雅黑細(xì)體', 'simsun'='宋體', 'simfang'='仿宋', 'simkai'='楷體', 'simhei'='黑體', 'SIMLI'='隸書', 'SIMYOU'='幼圓', 'STSONG'='華文宋體', 'STZHONGS'='華文中宋', 'STFANGSO'='華文仿宋', 'STKAITI'='華文楷體', 'STXIHEI'='華文細(xì)黑', 'STLITI'='華文隸書', 'STXINGKA'='華文行楷', 'STXINWEI'='華文新魏', 'STCAIYUN'='華文彩云', 'STHUPO'='華文琥珀' ) fmapr <- names(fmap); names(fmapr) <- unname(fmap) cat('==== 字體文件名與字體名稱對(duì)應(yīng):\n') print(fmap) cat('==== 字體名與字體文件名對(duì)應(yīng):\n') print(fmapr) ## 找到某個(gè)字體的字體文件 ## font.name是字體名稱 find.font <- function(font.name){ fname <- fmapr[font.name] flist0 <- font.files() flist1 <- sapply(strsplit(flist0, '[.]'), function(it) it[1]) flist0[flist1==fname] } ff1 <- find.font('宋體') ff2 <- find.font('黑體') ff3 <- find.font('仿宋') ff4 <- find.font('隸書'); font.add('cjk4', regular=ff1, bold=ff2, italic=ff3, bolditalic=ff4) ##browser() pdf('test-chinese.pdf'); on.exit(dev.off()) par(family='cjk4') plot(c(0,1), c(0,1), type='n', axes=FALSE, xlab='', ylab='') text(0.1, 0.9, '正體', font=1) text(0.1, 0.8, '粗體', font=2) text(0.1, 0.7, '斜體', font=3) text(0.1, 0.6, '粗斜體', font=4) } test.chinese()
注意:圖形參數(shù)font=1表示正體, font=2表示粗體, font=3表示斜體, font=4表示粗斜體。
其他圖形
相關(guān)系數(shù)圖
用cor(x)可以計(jì)算數(shù)據(jù)框x的各列的相關(guān)系數(shù)陣。 corrgram包的corrgram()函數(shù)可以將相關(guān)系數(shù)陣用圖形表示, 系數(shù)絕對(duì)值大小用色塊顏色深淺表示, 正負(fù)用兩種顏色區(qū)分。
例如, 計(jì)算iris數(shù)據(jù)框中四個(gè)測(cè)量值的相關(guān)系數(shù)并用矩陣表示:
library(corrgram) R.iris <- cor(iris[,1:4]) print(round(R.iris, 2))
## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Sepal.Length 1.00 -0.12 0.87 0.82 ## Sepal.Width -0.12 1.00 -0.43 -0.37 ## Petal.Length 0.87 -0.43 1.00 0.96 ## Petal.Width 0.82 -0.37 0.96 1.00
corrgram( R.iris, order=TRUE, lower.panel=panel.shade, upper.panel = panel.pie, text.panel = panel.txt )
左下方用顏色代表正負(fù)相關(guān), 藍(lán)色為正相關(guān),紅色為負(fù)相關(guān), 可以看出花萼長(zhǎng)(Sepal.Length)、花瓣寬(Petal.Width)和花瓣長(zhǎng)(Petal.Length)相互為較強(qiáng)的正相關(guān), 但是花萼寬與其它三個(gè)變量為負(fù)相關(guān)。 這個(gè)相關(guān)結(jié)果實(shí)際是虛假的, 因?yàn)闃颖静皇菃我豢傮w而是來自三個(gè)總體。 圖形右上方用陰影部分大小和顏色深度代表相關(guān)系數(shù)絕對(duì)值, 用顏色區(qū)分正負(fù)。
下一篇文章帶大家著重分析ggplot的運(yùn)用文章來源:http://www.zghlxwxcb.cn/news/detail-441311.html
希望能夠幫助到你文章來源地址http://www.zghlxwxcb.cn/news/detail-441311.html
到了這里,關(guān)于[R語(yǔ)言]手把手教你如何繪圖(萬字)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!