高级数据管理

1、数值和字符处理函数

(1)数学函数

函数 含义
abs(x) 绝对值
sqrt(x) 平方根和25^(0.5)等价
ceiling(x) 不小于x的最小整数,正无穷方向取整
floor(x) 不大于x的最大整数,负无穷方向取整
trunc(x) 向 0 的方向截取的x中的整数部分
round(x, digits=n) 将x舍入为指定位的小数
signif(x, digits=n) 将x舍入为指定的有效数字位数,
signif(3.475, digits=2) 返回值为3.5
cos(x)、 sin(x) 、 tan(x) 余弦、正弦和正切
acos(x) 、 asin(x) 、 atan(x) 反余弦、反正弦和反正切
cosh(x) 、 sinh(x) 、 tanh(x) 双曲余弦、双曲正弦和双曲正切
acosh(x) 、 asinh(x) 、 atanh(x) 反双曲余弦、反双曲正弦和反双曲正切
log(x,base=n) n为底,x的对数
log(x) e为底,x的对数
log10(x) 10为底,x的对数
exp(x) e指数函数

以上函数如果用于向量、矩阵或者数据框,则对每个元素进行运算。

(2)统计函数

函数 含义
mean(x) 均值
median(x) 中位数
sd(x) 标准差
var(x) 方差
mad(x) 绝对中位差
quantile(x,probs) 分位数,probs一个[0,1]之间的概率数值向量
range(x) 求值域
sum(x) 求和
diff(x, lag=n) 滞后差分,lag为滞后几项,默认为1
min(x) 最小值
max(x) 最大值
scale(x, center=TRUE, scale=TRUE) 为数据对象x按列进行中心化(center=TRUE)或标准化(center=TRUE,scale=TRUE)

(3)概率函数

分布 函数
Beta分布 beta
Logistic分布 logis
二项分布 binom
多项分布 multinom
柯西分布 cauchy
负二项分布 nbinom
(非中心)卡方分布 chisq
正态分布 norm
指数分布 exp
泊松分布 pois
F分布 f
Wilcoxon符号秩分布 signrank
Gamma分布 gamma
t分布 t
几何分布 geom
均匀分布 unif
超几何分布 hyper
Weibull分布 weibull
对数正态分布 lnorm
Wilcoxon秩和分布 wilcox

1)、设定随机数种子

set.seed(),这样可以重现结果

2)、生成多元正态数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(MASS)
options(digits=3)
set.seed(1234)
mean=c(230.4,123.2,3.7)
sigma=matrix(c(15360.8,6721.2,-47.1,6721.2,4700.9,-16.5,-47.1,-16.5,0.3),nrow=3,ncol=3)
#多元正态数据
mydata=mvrnorm(50000,mean,sigma)
mydata=as.data.frame(mydata)
names(mydata)=c("x","y","z")
#三维散点图
library(scatterplot3d)
scatterplot3d(mydata$x, mydata$y, mydata$z, highlight.3d=TRUE,col.axis="blue", col.grid="lightblue", main="scatterplot3d - 2", pch=20)

(4)字符处理函数

函数 含义
nchar(x) 返回字符数量
substr(x,start,stop) 提取货替换一个字符中的字串,substr(x,2,4)<-“xxx”
grep(pattern, x, ignore. case=FALSE,fixed=FALSE) 在x中搜索某种模式,fixed=FALSE则表示为一个正则表达式,若fixed=TRUE则为文本,返回下标
sub(pattern, replacement,x, ignore. case=FALSE,fixed=FALSE) 在x中搜索某种模式,并替换为replacement,fixed=FALSE则表示为一个正则表达式,若fixed=TRUE则为文本
strsplit(x, split, fixed=FALSE) 拆分字符串,fix同上
paste(…, sep=””) 连接字符串,分隔符为sep
toupper(x) to大写
tolower(x) to小写

(5)其他函数

函数 含义
length(x) 求长度
seq(from,to,by) 生成序列
rep(x,n) X重复n次
cut(x,n) 将连续型变量x分割为有着n个水平的因子,使用选项ordered_result = TRUE以创建一个有序型因子
pretty(x,n) 创建美观的分割点。通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。绘图中常用
cat(. .., file =”myfile”,append =FALSE) 连接…中的对象,并将其输出到屏幕上或文件中(如果声明了一个的话)

(6)函数应用到矩阵或数据框

1
2
3
4
5
apply(x,MARGIN,FUN,…)
#x:数据对象
#MARGIN:1表示行,2表示列
#FUN:表示函数
#…:表示参数

一个数据处理问题:按照姓名排序并且对成绩评级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#初始化数据
options(digits = 2)
Student=c("J D","A W","B M","D J","J M","C C","R Y","G K","J E","M R")
Math=c(502,600,412,358,495,512,410,625,573,522)
Science=c(95,99,80,82,75,85,80,95,89,86)
English=c(25,22,18,15,20,28,15,30,27,18)
roster=data.frame(Student,Math,Science,English,stringsAsFactors = FALSE)
#归一化成绩
z<-scale(roster[,2:4])
#平均成绩
score<-apply(z,1,mean)
#平均成绩加入数据框
roster=cbind(roster,score)
#取成绩分位数
y=quantile(score,c(.8,.6,.4,.2))
#新增级别变量并赋值
roster$grade[score>=y[1]]<-"A"
roster$grade[score>=y[2] & score<y[1]]<-"B"
roster$grade[score>=y[3] & score<y[2]]<-"C"
roster$grade[score>=y[4] & score<y[3]]<-"D"
roster$grade[score<y[4]]<-"F"
#拆分姓名列为两列
name=strsplit(roster$Student," ")
lastname=sapply(name, "[",2)
firstname=sapply(name, "[",1)
#重新加入姓名两列至数据框
roster<-cbind(firstname,lastname,roster[,-1])
#按照姓名两列排序
roster=roster[order(lastname,firstname),]

2、控制流

(1)重复和循环

  • 低效费时,尽量使用内建函数与apply函数

1)

1
2
3
4
5
#for:
for (var in seq) statement
#eg.
for (i in 1:10) print("Hello world")

2)

1
2
3
4
5
6
7
8
9
#while:
while(cond) statement
#eg.
i=0;
while(i<10)
{
print("x");i=i+1
}

(2)条件执行

1)

1
2
#if-else结构
if(!is.character(date)) {date2<-as.factor(date)} else {print("Done")}

2)

1
2
3
4
5
6
7
8
9
#switch结构
feeling<-c("sad","afraid")
for(i in feeling)
print(
switch(i,
happy="Happy",
sad="Sad",
afraid="afraid")
)

3、用户自编函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#函数:
mystats<-function(x,parametric=TRUE,print=FALSE){
if(parametric){
center<-mean(x);spread<-sd(x)
centerStr<- paste("Mean=",center,"\n","SD=",spread,"\n")
}else{
center<-median(x);spread<-mad(x)
centerStr<- paste("Median=",center,"\n","MAD=",spread,"\n")
}
if(print){
cat(centerStr)
}
return (list(center=center,spread=spread))
}
#使用:
set.seed(1234)
x<-rnorm(500)
y=mystats(x,parametric = TRUE,print = FALSE)
#函数:
mydate<-function(type="long"){
switch(type,
long=format(Sys.time(),"%A %B %d %Y"),
short=format(Sys.time(),"%m-%d-%y"),
cat(type,"is not a recognized type\n")
)
}
#使用:
mydate("short")

4、整合与重构

(1)转置

1
2
cars<-mtcars[1:5,1:4]
t(cars)

(2)聚合函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#整合
options(digits = 3)
attach(mtcars)
aggdata=aggregate(mtcars, by =list(气缸=cyl,档位=gear),FUN=mean,na.rm=TRUE)
aggdata
#将所有数据按照气缸与档位进行分组,求均值
气缸 档位 mpg cyl disp hp drat wt qsec vs am gear carb
1 4 3 21.5 4 120 97 3.70 2.46 20.0 1.0 0.00 3 1.00
2 6 3 19.8 6 242 108 2.92 3.34 19.8 1.0 0.00 3 1.00
3 8 3 15.1 8 358 194 3.12 4.10 17.1 0.0 0.00 3 3.08
4 4 4 26.9 4 103 76 4.11 2.38 19.6 1.0 0.75 4 1.50
5 6 4 19.8 6 164 116 3.91 3.09 17.7 0.5 0.50 4 4.00
6 4 5 28.2 4 108 102 4.10 1.83 16.8 0.5 1.00 5 2.00
7 6 5 19.7 6 145 175 3.62 2.77 15.5 0.0 1.00 5 6.00
8 8 5 15.4 8 326 300 3.88 3.37 14.6 0.0 1.00 5 6.00

(3)reshape包

1)融合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#测试数据
id=c(1,1,2,2)
time=c(1,2,1,2)
x1=c(5,3,6,2)
x2=c(6,5,1,4)
textData=data.frame(id,time,x1,x2,stringsAsFactors = FALSE)
library(reshape)
md<-melt(textData, id=(c("id","time")))
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
#转换为
id time variable value
1 1 1 x1 5
2 1 2 x1 3
3 2 1 x1 6
4 2 2 x1 2
5 1 1 x2 6
6 1 2 x2 5
7 2 1 x2 1
8 2 2 x2 4

2)重铸

cast(md, formula,FUN) #md为已经融合的数据

formula: rowvar1 + rowvar2 +…~ colvar1 + colvar2 +…

在这一公式中, rowvar1 + rowvar2 + …定义了要划掉的变量集合,以确定各行的内容,

而colvar1 + colvar2 + …则定义了要划掉的、确定各列内容的变量集合。

参见图中的示例。

基本数据管理

1、创建新变量

1
2
3
4
5
6
7
8
9
10
11
12
13
#方法1
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
mydata$sumx<-mydata$x1+mydata$x2
mydata$meanx<-(mydata$x1+mydata$x2)/2
#方法2
attach(mydata)
mydata$sumx<-x1+x2
mydata$meanx<-(x1+x2)/2
detach(mydata)
#方法3:推荐
mydata<-transform(mydata,sumx=x1+x2,meanx=(x1+x2)/2)

2、变量重编码

需要使用逻辑运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#示例数据:
manager<-c(1,2,3,4,5)
date<- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
country<- c("US","US","UK","UK","UK")
gender<-c("M","F","F","M","F")
age<-c(32,45,25,39,99)
q1<-c(5,3,3,3,2)
q2<-c(4,5,5,3,2)
q3<-c(5,2,5,4,1)
q4<-c(5,5,5,NA,2)
q5<-c(5,5,2,NA,1)
leadership<-data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1

(1)将年龄99重编码为缺失值

1
2
leadership$age[leadership$age == 99] <-NA
#variable[condition] <- expression将仅在condition的值为TRUE时执行赋值

(2)创建agecat变量

1
2
3
4
5
6
7
8
9
leadership$agecat[leadership$age>75] <-"Elder"
leadership$agecat[leadership$age>=55 & leadership$age<=75] <-"Middle Aged"
leadership$agecat[leadership$age<55] <-"Young"
#更紧凑的写法:within类似于with不过可以修改数据
leadership<-within(leadership,{
agecat <- NA
agecat[leadership$age>75] <-"Elder"
agecat[leadership$age>=55 & leadership$age<=75] <-"Middle Aged"
agecat[leadership$age<55] <-"Young"})

3、变量的重命名

(1)交互方式:fix(leadership)

(2)编程方式:

1
2
3
4
#(需要安装包library(reshape))
rename(dataframe,c(oldname="newname", oldname="newname",…))
names(leadership)[1] <- "managerID"
names(leadership)[6:10]<- c("1","2","3","4","5")

4、缺失值处理

(1)识别:is.na(y),不可使用逻辑测试yvar==NA,永远为false,R中NA为关键字表示缺失值

(2)重编码为缺失值:见2

(3)分析中排除缺失值:
诸多函数中含有排除缺失值的参数,

1
2
3
4
x<-c(1,2,NA,3)
y<-sum(x)#y=NA
y<-sum(x,na.rm = TRUE)
#另一种方式行删除:na.omit(leadership),删除含有缺失值的行,更复杂的方式见后续。

5、日期值

(1)字符型变量转化为数值形式的日期变量,as.Date(x,"input_format")

  • %d 数字表示的日期(0~31) 01~31
  • %a 缩写的星期名 Mon
  • %A 非缩写星期名 Monday
  • %m 月份(00~12) 00~12
  • %b 缩写的月份 Jan
  • %B 非缩写月份 January
  • %y 两位数的年份 07
  • %Y 四位数的年份 2007
1
2
3
4
myformat="%m/%d/%y"
leadership$date<-as.Date(leadership$date,myformat)#此处确保myformat形式与date形式相同
Sys.Date()#获取当前日期
date()#获取当前日期与时间

(2)输出为特定格式的日期

1
2
3
4
5
6
7
8
9
10
11
12
today<-Sys.Date()
format(today, format="%B%d%Y")
format(today, format="%A")
#两个日期之间可以进行算术运算:
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
days <- enddate-startdate
#也可以使用difftime计算时间间隔,以星期,天,时,分,秒表示
#("auto", "secs", "mins", "hours", "days", "weeks")
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
difftime(startdate,enddate,units="weeks")

(3)日期转换为字符型变量
strDates <- as.character(dates)

(4)更近一步

1
2
3
4
help(as.Date)
help(strftime)
help(ISOdatetime)
#两个包:lubridate,fCalendar,包含大量日期处理函数

6、类型判断

判 断 转 换
is.numeric() as.numeric()
is.character() as.character()
is.vector() as.vector()
is.matrix() as.matrix()
is.data.frame() as.data.frame()
is.factor() as.factor()
is.logical() as.logical()

7、数据排序

1
2
3
4
5
6
7
8
9
10
11
12
attach(leadership)
#排序后的数据重新赋值,按照性别年龄排序,默认为升序,排序字段前加’-’为降序
newdata=leadership[order(gender,age),]
#降序方式 newdata=leadership[order(gender,-age),]
> newdata
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
detach(leadership)

8、数据集合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
> #增加列
> newdata
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
> newcol=data.frame(meta=c(11,12,13,14,15),manager=c(1,2,3,4,5),country=c("US","US","US","US","US"))
> newcol
meta manager country
1 11 1 US
2 12 2 US
3 13 3 US
4 14 4 US
5 15 5 US
> #按照by=中的列合并数据框,结果为inner join,取交集
> total=merge(newdata,newcol,by=c("manager","country"))
> total
manager country date gender age q1 q2 q3 q4 q5 meta
1 1 US 10/24/08 M 32 5 4 5 5 5 11
2 2 US 10/28/08 F 45 3 5 2 5 5 12
> #直接合并不进行列字段匹配,需要行数一致
> total=merge(newdata,newcol,by=c("manager"))
> total
manager date country.x gender age q1 q2 q3 q4 q5 meta country.y
1 1 10/24/08 US M 32 5 4 5 5 5 11 US
2 2 10/28/08 US F 45 3 5 2 5 5 12 US
3 3 10/1/08 UK F 25 3 5 5 5 2 13 US
4 4 10/12/08 UK M 39 3 3 4 NA NA 14 US
5 5 5/1/09 UK F 99 2 2 1 2 1 15 US
> total=cbind(total,newcol)
> total
manager date country.x gender age q1 q2 q3 q4 q5 meta country.y meta manager country
1 1 10/24/08 US M 32 5 4 5 5 5 11 US 11 1 US
2 2 10/28/08 US F 45 3 5 2 5 5 12 US 12 2 US
3 3 10/1/08 UK F 25 3 5 5 5 2 13 US 13 3 US
4 4 10/12/08 UK M 39 3 3 4 NA NA 14 US 14 4 US
5 5 5/1/09 UK F 99 2 2 1 2 1 15 US 15 5 US
> #追加行,顺序不需要一致,单变量必须相同,如变量不同,需平衡变量(删除多余变量,补充变量为NA)使得列一致
> total=rbind(newdata,newdata)
> total
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
31 3 10/1/08 UK F 25 3 5 5 5 2
21 2 10/28/08 US F 45 3 5 2 5 5
51 5 5/1/09 UK F 99 2 2 1 2 1
11 1 10/24/08 US M 32 5 4 5 5 5
41 4 10/12/08 UK M 39 3 3 4 NA NA

9、数据集取子集

(1)选入(保留)变量

1
2
3
dataframe[row indices, column indices]
#行标记选择空表示所有行
newdata=leadership[,c(6:10)]

(2)剔除变量

1
2
3
4
5
6
7
#方式1:
myvars=names(leadership) %in% c("q3","q4")#形成一个布尔数组
newdata=leadership[!myvars]#只保留布尔数组中为TRUE的列
#方式2:
newdata=leadership[c(-8,-9)]#需要知道序号
#方式3:
newdata$gender=newdata$age=NULL #直接删除某几列

(3)选择行

1
2
3
4
5
6
7
8
9
10
11
12
13
dataframe[1:3,]
#条件选择
leadership[which(leadership$gender=="M" & leadership$age > 30)]
attach(leadership)
leadership[which(gender=="M" & age > 30)]
detach(leadership)
#实例:
leadership$date=as.Date(leadership$date,"%m/%d/%y")
startdate=as.Date("2009-01-01")
enddate=as.Date("2009-10-31")
newdata=leadership[which(leadership$date >= startdate & leadership$date <= enddate),]

(4)subset()函数

1
2
newdata<- subset(leadership, age >= 35| age<24,select = c(q1,q2,q3,q4))
newdata<- subset(leadership, gender=="M" & age>25, select=gender:q4)

(5)随机抽样
sample(抽取的母集合,抽取数量,是否放回抽样)

1
mysample <- leadership[sample(1:nrow(leadership),3,replace=FALSE),]

10、SQL语句操作数据框

install.packages("sqldf")

1
2
newdf <- sqldf("select AVG(mpg),am from mtcars where carb=1 group by am",row.names=TRUE)
#row.names=TRUE表示是否沿用原来的行名称

图形初步

1、基本图形

plot(o_data,type=”b”,main=”主标题”,sub=”子标题”,xlab=”年龄”,ylab=”周长”)


2、符号与线条

参数 含义
pch 指定绘制点时使用的符号
cex 指定符号的大小。cex是一个数值,表示绘图符号相对于默认大小的缩放倍数。默认大小为1, 1.5表示放大为默认值的1.5倍, 0.5表示缩小为默认值的50%,等等
lty 指定线条类型
lwd 指定线条宽度。 lwd是以默认值的相对大小来表示的(默认值为1)。例如, lwd=2将生成一条两倍于默认宽度的线条


1
plot(o_data,type="b", pch="8", cex=1, lty=6, lwd=2)

3、颜色

参数 含义
col 默认的绘图颜色。某些函数(如lines和pie)可以接受一个含有颜色值的向量并自动循环使用。 例如, 如果设定col=c(“red”, “blue”)并需要绘制三条线,则第一条线将为红色,第二条线为蓝色,第三条线又将为红色
col.axis 坐标轴刻度文字的颜色
col.lab 坐标轴标签(名称)的颜色
col.main 标题颜色
col.sub 副标题颜色
fg 图形的前景色
bg 图形的背景色

在R中,可以通过颜色下标、颜色名称、十六进制的颜色值、 RGB值或HSV值来指定颜色。举例来说, col=1、 col=”white”、 col=”#FFFFFF”、 col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色的等价方式。


rainbow(n) 生成n种连续的彩虹色
gran(0:n/n) 生成N阶灰度色

4、文本属性

用于指定文本大小的参数:

参数 含义
cex 表示相对于默认大小缩放倍数的数值。默认大小为1, 1.5表示放大为默认值的1.5倍, 0.5表示缩小为默认值的50%,等等
cex.axis 坐标轴刻度文字的缩放倍数。类似于cex
cex.lab 坐标轴标签(名称)的缩放倍数。类似于cex
cex.main 标题的缩放倍数。类似于cex
cex.sub 副标题的缩放倍数。类似于cex

用于指定字体族、字号和字样的参数:

参数 含义
font 整数。用于指定绘图使用的字体样式。 1=常规, 2=粗体, 3=斜体, 4=粗斜体,5=符号字体(以Adobe符号编码表示)
font.axis 坐标轴刻度文字的字体样式
font.lab 坐标轴标签(名称)的字体样式
font.main 标题的字体样式
font.sub 副标题的字体样式
ps 字体磅值(1磅约为1/72英寸)。文本的最终大小为 ps*cex
family 绘制文本时使用的字体族。标准的取值为serif (衬线)、 sans (无衬线)和mono(等宽)

在Windows中,可以通过函数windowsFont()来创建字体簇这类映射。在Mac上,请改用quartzFonts()。

使用时为par(family=A)

默认在Windows系统中,等宽字体映射为TT Courier New,衬线字体映射为TT Times New Roman,无衬线字体则映射为TT Arial(TT代表True Type)

若使用pdf输出图形,可以使用names(pdfFonts())找出那些字体可用,然后使用pdf(file="myplot.pdf", family="fontname")

5、图形尺寸

用于控制图形尺寸和边界大小的参数:

参数 含义
pin 以英寸表示的图形尺寸(宽和高)
mai 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸
mar 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分(1/12英寸)。默认值为c(5, 4, 4, 2) + 0.1

par(pin=c(4,3),mar=c(5,0.5,5,0.5))

6、自定义文本坐标轴和图例

par()或者plot()中添加ann=FALSE来移除默认的标题和标签

1、自定义坐标轴

axis(side,at=,labels=,pos=,lty=,col=,las=,tck=,…)

使用自定义坐标轴应当禁用自动坐标轴:axes=FALSE

  • 将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt=”n”和yaxt=”n”将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。

坐标轴选项

参数 含义
side 一个整数,表示在图形的哪边绘制坐标轴(1=下, 2=左, 3=上, 4=右)
at 一个数值型向量,表示需要绘制刻度线的位置
labels 一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值)
pos 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)
lty 线条类型
col 线条和刻度线颜色
las 标签是否平行于(=0)或垂直于(=2)坐标轴
tck 刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧, 0表示禁用刻度, 1表示绘制网格线);默认值为-0.01
1
2
3
4
5
6
7
8
9
10
11
#实例:
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)
#yaxt=”n”表示不绘制Y轴刻度
lines(x,z,type="b",pch=22,col="blue",lty=2)
axis(2,at=x,labels=x,col.axis="red",las=2)
axis(4,at=z,labels=round(z,digits=2),col.axis="blue",las=2,cex.axis=0.7,tck=-.01)
mtext("y=10/x",side=4,line=3,cex.lab=1,las=2,col="blue")
title("Axes",xlab="X values", ylab="Y=X")
par(opar)

2、次要刻度线

使用包Hmisc 中的minor.tick()函数。

1
2
3
minor.tick(nx=n,ny=n,tick.ratio=n)
//nx、ny: X、Y轴两条主刻度线之间需要的区间个数
//tick.ratio: 次要刻度线相对于主刻度线的大小比例

3、参考线

abline()为图形添加参考线:
abline(h=yvalues,v=xvalues),其中也可以指定其他参数

4、图例

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=加上颜色值组成的向量
1
2
3
4
5
6
7
8
9
10
11
12
13
#实例:
dose<-c(20,30,40,45,60);
dA<-c(16,20,27,40,60);
dB<-c(15,18,25,31,40);
opar<-par(no.readonly = TRUE);
par(lwd=2,cex=1.5,font.lab=2);
plot(dose,dA,type="b",pch=15,lty=1,col="red",ylim=c(0,60),main="Drug A vs. Drug B",xlab="Drug Dosage", ylab="Drug REsponse");
lines(dose,dB,type="b",pch=17,lty=2,col="blue");
abline(h=c(30),lwd=1.5,lty=2,col="gray");
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"));
#inset表示图例距离主图边框的距离百分比,当位置是用关键字表示时
par(opar)

5、文本标注

向绘图区域内部添加文本(同时可以绘制点):text(location, "text to place", pos,…)
向图形四个边界之一添加文本:mtext("text to place", side, line=n,…)

参数 含义
location 文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置
pos 文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示
side 指定用来放置文本的边。 1=下, 2=左, 3=上, 4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对齐
1
2
3
4
5
#实例:
plot(dA,dose,pch=18,col="blue")
text(40,33,family="serif","TEST")
text(dA,dose,row.names(dA),cex=0.6,pos=4)
#从某个数据框的行名称中读取文本

6、数学标注

1
2
3
#在(1,1.9)点输出公式,hat(x)表示x拔
text(1,1.9,expression (hat(x)))
#expression中语句会解释为数学公式

7、 图形组合

  • par参数mfrow=c(nrows,ncols)来创建图形矩阵,mfrow表示按行排列,nfcol表示按列排列。

  • layout()函数可控制更多参数

1
2
3
4
5
6
7
8
9
10
#图形组合
attach(mtcars)
opar<-par(no.readonly = TRUE)
par(mfrow=c(2,2))
plot(wt,mpg,main="wt vs. mpg")
plot(wt,disp,main="wt vs. disp")
hist(wt,main="histogram of wt")
boxplot(wt, main="Boxplot of wt")
par(opar)
detach(mtcars)

1
2
3
4
5
6
7
8
#图形组合layout()
attach(mtcars)
layout(matrix(c(1,1,2,3),2,2,byrow=TRUE),widths=c(3,1),heights=c(1,2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
#矩阵表示每个图排列的位置,1123表示第一行的两个位置均排列第一个图片,第二个图片在左下角位置,第三个图片在右下角位置,widths表示一行内不同图片的宽度比例,height为不同行的图高度比例