第二章 R绘图基础

1 R语言基本绘图函数(graphics包)

1.1 【图2-1】高级绘图函数plot()的简单应用

  • 解释什么是绘图全局参数设置和局部参数设置?

  • 为什么plot()能根据不同的输入形式作出不同的图形?

# 设置全局图形参数(后续绘图生效)
par(mfrow=c(2,2),               # 设置多图布局:2行 x 2列(共4个子图) 
    mai=c(0.6,0.6,0.4,0.4),     # 设置图形边距(上左上右)
    cex=0.7,                    # 所有文本(轴标签、标题等)缩小到70%
    cex.main=1,                 # 主标题保持默认大小(不缩放)
    font.main=1)                # 主标题字体样式:1=普通,2=粗体,3=斜体,4=粗斜体
plot(R,Python,
     main="(a) 散点图")
plot(factor(性别),
     xlab="性别",ylab="人数",   #局部参数设置
     main="(b) 条形图")
plot(R~factor(性别),
     xlab="性别",
     main="(c) 箱线图")
plot(factor(性别)~R,
     ylab="性别",
     main="(d) 脊形图")

1.2 【图2-2】高级绘图函数plot()的泛型函数应用

  • 什么是R语言的泛型函数?

  • lm类对象输入plot()将会输出哪些图形?

par(mfrow=c(2,2),mai=c(0.6,0.6,0.2,0.1),cex=0.7)
model<-lm(R~Python,data=data2_1)
plot(model)                     #plot为泛型函数,针对lm类输出四个诊断图

1.3 【图2-3】低级绘图函数——在已有的图上增加新的元素

  • 高级绘图函数和低级绘图函数有什么区别?

  • 代码中哪些函数是低级作图函数,分别有什么用?

## 模拟数据
par(mfrow=c(1,1),mai=c(0.7,0.7,0.4,0.4),cex=0.7)
set.seed(1)
x <- rnorm(200)  
y <- 1+2*x +rnorm(200)
d<-data.frame(x,y)

# 高级作图
d |> plot(xlab="x=自变量",ylab="y=因变量")        # 绘制散点图
# 低级作图
grid(col="grey60")                             # 增加网格线
axis(side=4,col.ticks="blue",lty=1)            # 增加坐标轴
polygon(d[chull(d),],lty=6,lwd=1,col="lightgreen")  # 增加多边形并填充底色
points(d)                                      # 重新绘制散点图
points(mean(x),mean(y),pch=19,cex=5,col=2)     # 增加均值点
abline(v=mean(x),h=mean(y),lty=2,col="gray30") # 增加均值水平线和垂直线
abline(lm(y~x),lwd=2,col=2)                    # 增加回归直线
lines(lowess(y ~ x,f=1/6),col=4,lwd=2,lty=6)   # 增加拟合曲线
segments(-0.8,0,-1.6,3.3,lty=6,col="blue")     # 增加线段
arrows(0.45,-2.2,-0.8,-0.6,code=2,angle=25,length=0.06,col=2) 
                                               # 增加带箭头的线段
text(-2.2,3.5,labels=expression("拟合的曲线"),adj=c(-0.1,0.02),col=4) 
                                               # 增加注释文本
rect(0.4, -2, 1.6,-4,col="pink",border="grey60")           # 增加矩形
mtext(expression(hat(y)==hat(beta)[0]+hat(beta)[1]*x),cex=0.9,side=1,line=-4.3,adj=0.72)                         # 增加注释表达式
legend("topleft",legend=c("拟合的直线","拟合的曲线"),lty=c(1,6),col=c(2,4),cex=0.8,fill=c("red","blue"),box.col="grey60",ncol=1,inset=0.02)                                # 增加图例
title("散点图及拟合直线和曲线\n并为图形增加新的元素",cex.main=0.8,font.main=4)   # 增加标题并折行,使用斜体字
box(col=4,lwd=2)                             # 增加边框

2 图形参数与图形控制

2.1 【图2-4】修改图形参数——增强绘图的可读性

  • 对绘图添加主标题有哪两种方式?

  • xlabylab两个局部参数有什么用?

par(mfrow=c(2,2),mai=c(0.6,0.6,0.3,0.2),cex=0.7,cex.main=1,font.main=1)

barplot(table(data2_1$性别))
title("(a) 默认设置的条形图")

barplot(table(data2_1$性别),horiz=TRUE,density=40,col="red",
  xlab="频数",ylab="性别",main="(b) 修改参数后的条形图")

boxplot(R~性别,data=data2_1)
title("(c) 默认设置的箱线图")

boxplot(R~性别,data=data2_1,col=c("lightgreen","skyblue"),
  xlab="性别",ylab="R考试分数",varwidth=TRUE,
  main="(d) 修改参数后的箱线图")

2.2 【图2-6】连线类型设置——type参数

  • par函数设置了全局参数哪些?

  • 参数type在不同图形中设置不同,具体代表什么?

x<-1:30
y <-sin(pi/10*x)
par(mfrow=c(2,3),mai=c(0.5,0.5,0.2,0.1),
  cex=0.7,cex.axis=0.6,cex.lab=0.7,mgp=c(2,1,0),cex.main=0.8)
plot(x,y,type="p",main="(a) type=“p”",font.main=2,col.main="red")
plot(x,y,type="b",pch=21,font.axis=3,font.lab=3,bg="lightgreen",
  main="(b) type=“b”",font.main=3)
plot(x,y,type="o",las=3,pch=0,fg="blue",col.lab="blue",
  main="(c) type=“o”",font.main=1)
plot(x,y,type="l",lty=2,col="blue",lwd=2,bty="l",main="(d) type=“l”")
plot(x,y,type="s",col="grey20",main="(e) type=“s”",font.main=4)
plot(x,y,type="h",col="red",lwd=2,col.axis="red",main="(f) type=“h”")

2.3 【图2-7】配色方案设置——col参数

  • 如果填充对象比配色数量多会怎么样?

  • 默认配色col=1:8将采用哪八种颜色,分别写出它们在R中的调用字符。

x<-1:10                                       # 生成1到10的等差数列
a<-LETTERS[1:10]                              # 生成字母标签向量
par(mfrow=c(1,2),mai=c(0.4,0.4,0.3,0.2),cex=0.8,cex.axis=0.7,
    cex.lab=0.8,mgp=c(2,1,0),cex.main=0.9,font.main=1)    # 图形参数设置

barplot(x,names=a,col=c("red","green"),main="(a) 循环使用2种颜色")
barplot(x,names=a,col=1:8,main="(b) 重复使用颜色1:8")

2.4 【图2-8】创建自己的调色板——RColorBrewer包

RColorBrewer包的三类调色板展示

library(RColorBrewer)
layout(matrix(c(1,1,2,3),nrow=2,ncol=2),widths=c(1,1))      # 页面布局
par(mai=c(0.1,0.35,0.2,0.1),cex=0.6,cex.main=1,font.main=1) # 图形参数设置
display.brewer.all(type='seq')                    # 展示连续型部分
title(main="(a) 单色连续型部分")                  # 添加标题
display.brewer.all(type="qual")                   # 展示离散型部分
title(main="(b) 多色离散型部分")
display.brewer.all(type="div")                    # 展示极端型部分
title(main="(c) 双色极端型部分")

  • brewer.pal需要输入哪些参数?函数返回一个什么向量?
library(RColorBrewer)
par(mfrow=c(2,3),mai=c(0.3,0.3,0.3,0.1),cex=0.6,font.main=1)
palette1<-brewer.pal(7,"Reds")            # 7种颜色的红色连续型调色板
palette2<-brewer.pal(7,"Set1")            # 7种颜色的离散型调色板
palette3<-brewer.pal(7,"RdBu")            # 7种颜色的红蓝色极端值调色板
palette4<-rev(brewer.pal(7,"Greens"))     # 调色板颜色反转
palette5<-brewer.pal(8,"Spectral")[-1]    # 去掉第1种颜色,使用其余7种
palette6<-brewer.pal(6,"RdYlBu")[2:4]     # 使用其中的2:4种颜色
a<-LETTERS[1:7]

barplot(1:7,names=a,col=palette1,main="(a) 单色连续型调色板")
barplot(1:7,names=a,col=palette2,main="(b) 多色离散型调色板")
barplot(1:7,names=a,col=palette3,main="(c) 双色极端值调色板")
barplot(1:7,names=a,col=palette4,main="(d) 调色板颜色反转")
barplot(1:7,names=a,col=palette5,main="(e) 去掉第1种颜色")
barplot(1:7,names=a,col=palette6,main="(f) 使用其中的2:4种颜色")

2.5 【图2-10】更多调色板函数——grDevices包

  • rainbow(8,start=0.4,end=0.5) 代表什么含义?
library(grDevices)
par(mfrow=c(2,4),mai=c(0.3,0.3,0.3,0.1),cex=0.7,
  mgp=c(1,1,0),cex.axis=0.7,cex.main=1,font.main=1)
x<-1:8
a<-LETTERS[1:8]                               # 生成字母标签向量

barplot(x,names=a,col=rainbow(8),main="col=rainbow()")
barplot(x,names=a,col=rainbow(8,start=0.4,end=0.5),
  main="col=rainbow(start=0.4,end=0.5)")
barplot(x,names=a,col=heat.colors(8),main="col=heat.colors()")
barplot(x,names=a,col=terrain.colors(8),main="col=terrain.colors()")
barplot(x,names=a,col=topo.colors(8),main="col=topo.colors()")
barplot(x,names=a,col=cm.colors(8),main="col=cm.colors()")
barplot(x,names=a,col=gray.colors(8),main="col=gray.colors()")
barplot(x,names=a,col=colors(256),main="col=colors(256)")

2.6 【图2-11】设置条件颜色——ifelse 函数的应用

  • ifelse函数有什么用?
x<-c(84,95,82,55,91,86,71,89,78,65)           # 10个学生的考试分数
sex<-c("女","女","男","女","男","男","女","女","男","女") # 性别向量
par(mfrow=c(2,2),mai=c(0.4,0.6,0.4,0.2),cex=0.7,font.main=1)

# 图(a)
cols<-ifelse(x>=90,"red","blue")              # 分数>=90 为红色,否则为蓝色
barplot(x,names=sex,col=cols,ylab="分数",
  main="(a) 分数>=90为红色,否则为蓝色")

# 图(b)
cols<-ifelse(x<60,"green","red") # 分数<=60为绿色,否则为红色
barplot(x,names=sex,col=cols,ylab="分数",
  main="(b) 分数<60为绿色,否则为红色")

# 图(c)
cols<-ifelse(x>mean(x),"red","blue")    # 分数>均值为红色,否则为蓝色
barplot(x,names=sex,col=cols,ylab="分数",
  main="(c) 分数>均值为红色,否则为蓝色")

# 图(d)
cols<-ifelse(sex=="男","red","blue") # 男性为红色,否则为蓝色
barplot(x,names=sex,col=cols,ylab="分数",
  main="(d) 男性为红色,否则为蓝色")

3 页面布局与图形组合

3.1 【图2-12】的绘制代码——par(mfrow=c(2,2):按行(列)填充各图

  • par函数中页面布局参数mfcolmfrow有什么区别?
par(mfrow=c(2,2),mai=c(0.4,0.4,0.3,0.1),cex=0.7,
  mgp=c(2,1,0),cex.axis=0.8,cex.main=1.2,font.main=1)
set.seed(123)                              # 设置随机数种子
x<-rnorm(100)                              # 生成100个标准正态分布随机数
y<-rexp(100)                               # 生成100个指数分布随机数
df<-data.frame(x,y)                        # 构建数据框
plot(df,col=sample(c("black","red","blue"),100,replace=TRUE),
  main="(a) 散点图")
boxplot(df,col=2:3,main="(b) 箱线图")
hist(x,col="orange1",main="(c) 直方图")
barplot(runif(5,10,20),names=LETTERS[1:5],col=2:6,main="(d) 条形图")

par(mfcol=c(2,2),mai=c(0.4,0.4,0.3,0.1),cex=0.7,mgp=c(2,1,0),cex.axis=0.8,cex.main=1.2,font.main=1)
set.seed(123)                              # 设置随机数种子
x<-rnorm(100)                              # 生成100个标准正态分布随机数
y<-rexp(100)                               # 生成100个指数分布随机数
df<-data.frame(x,y)
plot(df,col=sample(c("black","red","blue"),100,replace=TRUE),main="(a) 散点图")
boxplot(df,col=2:3,main="(b) 箱线图")
hist(x,col="orange1",main="(c) 直方图")
barplot(runif(5,10,20),names=LETTERS[1:5],col=2:6,main="(d) 条形图")

3.2 【图2-13】的绘制代码——图形布局:layout函数

  • layout函数与par(mfrow)在页面布局中有什么差别?
n=100;set.seed(12);x<-rnorm(n);y<-rexp(n)
layout(matrix(c(1,1,2,3,4,4,5,5,6,7,7,8),3,4,byrow=TRUE),
  widths=c(1:1),heights=c(1:1))
par(mai=c(0.3,0.3,0.3,0.1),cex.main=0.9,font.main=1)
barplot(runif(8,1,8),names=LETTERS[1:8],col=2:7,main="(a) 条形图")
pie(1:12,col=rainbow(6),labels="",border=NA,main="(b) 饼图")
qqnorm(y,col=1:7,pch=19,xlab="",ylab="",main="(c) Q-Q图")
plot(x,y,pch=21,bg=c(2,3,4),cex=1.2,xlab="",ylab="",main="(d) 散点图")
plot(rnorm(25),rnorm(25),cex=(y+2),col=2:4,lwd=2,
  xlab="",ylab="",main="(e) 气泡图")
hist(rnorm(1000),col=3,xlab="",ylab="",main="(f) 直方图")
plot(density(y),col=4,lwd=1,xlab="",ylab="",main="(g) 核密度图")
polygon(density(y),col="gold",border="blue")
boxplot(x,col=2,main="(h) 箱线图")