R语言graphics绘图原理
graphics包也称为传统绘图系统,一些基本绘图函数均由该包提供。在最初安装R软件时,该包
就已经安装在R程序中,其中的绘图函数可以直接使用,而不必加载graphics包。
graphics包中的绘图函数大致可分为两大类:一类是高级绘图函数,这类函数可以产生一幅独立的图形;另一类是低级绘图函数,这类函数通常不产生独立的图形,而是在高级函数产生的图形上添加一些新的图形元素,如标题、文本注释、线段等。
高级函数
函数 | 数据类型 | 图形 |
---|---|---|
plot | 多种数据类型 | 多种图形 |
assocplot | 二维列连表 | 关联图 |
barplot | 数值向量、矩阵、列联表 | 条形图 |
boxplot | 数值向量、列表、数据库 | 箱线图 |
cdplot | 单一数值向量、一个对象 | 条件密度图 |
coplot | 表达式 | 条件图 |
contour | 数值 | 等高图 |
curve | 表达式 | 曲线 |
dotchart | 数值向量、矩阵 | 点图 |
fourfoldplot | 2 X 2表 | 四折图 |
hist | 数值向量 | 直方图 |
image | 数值 | 色阵图 |
matplot | 数值向量、矩阵 | 矩阵列图 |
mosaicplot | 二维列联表、N维列联表 | 马赛克图 |
pairs | 矩阵、数据库 | 散点图矩阵 |
persp | 数值 | 三维透视图 |
pie | 非负的数值向量 | 饼图 |
stars | 矩阵、数据库 | 星图 |
stem | 数值向量 | 茎叶图 |
stripchart | 数值向量、数值向量列表 | 带状图 |
sun flower plot | 数值向量、因子 | 太阳花图 |
symbols | 数值 | 符号图 |
低级函数
函数 | 描述 |
---|---|
abline | 为图形添加截距为a,斜率为b的直线 |
arrows | 在坐标点(x0,y0)和(x1,y1)之间绘制线段,并在端点处添加箭头 |
box | 绘制图形的边框 |
layout | 布局图形页面 |
legend | 在坐标点(x,y)添加图例 |
lines | 在坐标点(x,y)添加直线 |
mtext | 在图形区域的边距或区域的外部边距添加文本 |
points | 在坐标点(x,y)添加点 |
polygon | 沿着坐标点(x,y)绘制多边形 |
polypath | 绘制一个或多个连续坐标点的路径组成的多边形 |
rasterlmaga | 绘制一个或多个网络图像 |
rect | 绘制一个左下角在(xleft,ybottom) ,右上角在(xright,ytop)的矩形 |
rug | 添加地毯图 |
segments | 在坐标点(x0,y0)和(x1,y1)之间绘制线段 |
text | 在坐标点(x,y)添加文本 |
title | 为图形添加标题 |
xspline | 根据控制点(x,y) 绘制x样条曲线(平滑曲线) |
举个例子(高级函数+低级函数)
用高级函数plot绘制散点图,绘图数据x和y是随机模拟的具有线性关系的两个变量,然后用低级函数给散点图添加多种新的元素,以增强图形的可读性。
par(mai=c(0.7,0.7,0.4,0.4),cex=0.8)
set.seed(1)
x<-rnorm(200)
y<-1+2*x +rnorm(200)
d<-data.frame (x,y)
plot(x,y,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,-1.6,1.6,-3.5,col="pink",border="grey60") #添加矩形
mtext (expression(hat(y)==hat(beta)[0]+hat (beta) [1]*x),cex =0.9,side=1,line=-6,adj=0.7) #添加注释表达式
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) #添加边框
图形参数与图形控制
绘图参数
使用barplot函数绘制出条形图,使用boxplot函数绘制出箱线图。(a)使用参数的默认设置,绘图完成后,使用低级函数title给图形加上标题。(b)设置函数的参数horiz=TRUE,将条形图按水平摆放(horiz=FALSE,垂直摆放)设置参数density=40来填充条的密度(默认density=NULL),并使用参数main=""设置图形标题(默认main=NULL)。(c)是使用boxplot函数的默认参数设置绘制的箱线图,使用低级函数title给图形加上标题。(d)设置col=c("lightgreen","skyblue"),为箱子加上不同的颜色,设置xlab="性别"、ylab="R考试分数",为图形加上x轴和y轴标签,使用参数main="",设置图形标题,设置varwidth=TRUE,使箱子的宽度与样本量的平方根呈正比。
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)修改参数后的箱线图")
图形控制
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.8,cex.axis=0.6,cex.lab=0.7,mgp=c(2,1,0),cex.main=0.8)
plot(x,y,type="p",font.main=2,main="(a) type=a",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")
图形颜色
颜色名称
#查看R的颜色名称
head(colors(), 10);tail(colors(), 10)
使用DescTools包中的ColPicker函数可以绘制出R语言全部颜色名称。
graphics包设置绘图颜色的参数主要有3个:col、bg和fg。参数col主要用于设置绘图区域中绘制的数据符号、线条、文本等元素的颜色;参数bg用于设置图形的背景颜色,如坐标轴、图形的边框等;参数fg用于设置图形的前景颜色,如图形区域的颜色等。
R语言的几种主要颜色也可以直接用数字1~8表示,比如,1="black",2="red",3="green",4="blue”等。设置单一颜色时,表示成col="red"(或col=2)。设置多个颜色时,则为一个颜色向量,如col=c("red","green","blue"),或col=c(2,3,4),连续的颜色数字也可以写成col=2:4,这3种写法等价。当需要填充的颜色多于设置的颜色向量时,颜色会被重复循环使用。比如,要填充10个条的颜色,col=c("red","green")两种颜色被重复使用。
x<-1:10 #生成1-10的等差数列
a<-c('A','B','C','D','E','F','G','H','I','J') #生成标签向量
par (mfrow=c(1,2),mai=c(0.4,0.4,0.2,0.2),cex=0.8,cex.axis=0.7,cex.lab=0.8,mgp=c(2,1,0),cex.main=0.8) #图形参数
barplot (x,names=a,col=c("red","green")) #循环使用两种颜色
barplot(x,names=a,col=1:7) #重复使用颜色1-7
颜色集合
par(mfrow=c(2,4),mai=c(0.3,0.3,0.2,0.1),cex=0.7,mgp=c(1,1,0),cex.axis=0.7,cex.main=0.8)
x <- 1:10
a<-c('A','B','C','D','E','F','G','H','I','J')
barplot(x,names=a,col=rainbow(10),main="col=rainbow()") #颜色从红色开始,经过橙色、黄色、绿色、蓝色、靛蓝色、紫色
barplot (x,names=a,col=rainbow(10,start=0.4,end=0.5),main="col=rainbow(start=0.4,end=0.5) ")
barplot(x,names=a,col=heat.colors(10),main="col=heat.colors()") #红色开始,经橙色到白色的变化过程
barplot (x,names=a,col=terrain.colors(10),main="col=terrain.colors()") #绿色开始,经棕色到白色的变化过程
barplot (x,names=a,col=topo.colors(10),main="col=topo.colors()") #蓝色开始,经棕色到白色的变化过程
barplot(x,names=a,col=cm.colors(10),main="col=cm.colors()") #从浅蓝色开始,经白色到紫色的变化过程
barplot (x,names=a,col=gray.colors(10),main="col=gray.colors()") #灰度(取值在0~100)渐变颜色集合
barplot(x,names=a,col=colors(256),main="col=colors(256) ")
调色板
如果对颜色有特殊要求,也可以使用调色板对图形进行配色。使用RColorBrewer包中的display.brewer.all函数可以查看R的调色板。
library(RColorBrewer)
layout(matrix(c(1,1,2,3),nrow = 2,ncol = 2),widths = c(2,1))
par(mai=c(0.1,0.4,0.2,0.1),cex=0.6,cex.main=1)
display.brewer.all(type='all')
title(main="(a)全部")
display.brewer.all(type="qual")
title(main="(b)离散型部分")
display.brewer.all(type="div")
title(main="(c)极端值部分")
页面布局与图形组合
用par函数布局页面
par (mfrow=c(2,2),mai=c(0.5,0.5,0.3,0.1),cex=0.7,mgp=c(2,1,0),cex.axis=0.8,cex.main=0.8)
set.seed(123) #生成随机数种子
e<-rnorm(100) #生成100个标准正态分布随机数
f<-rexp (100) #生成100个指数分布随机数
plot(e,f,col=sample(c("black","red","blue"),100,replace=TRUE),main="(a)散点图")
boxplot(e,f,col=2:3,main="(b)箱线图")
hist(e,col="orange1",ylab="f",main="(c)直方图")
barplot(runif(5,10,20),col=2:6,main="(d)条形图")
使用layout函数布局页面,layout函数是将绘图区域划分为nr X nc列的矩阵,并可以设置参数widths和heights将矩阵分割成大小不同的区域
n=100;set.seed(12);x<-rnorm(n);y<-rexp(n)
layout (matrix (c(1,2,3,4,5,5,6,7,8),3,3,byrow=TRUE),widths=c(2:1),heights=c(1:1))
par(mai=c(0.3,0.3,0.2,0.1),cex.main=0.9)
barplot(runif(8,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=19,col=c(1,2,4),xlab="",ylab="",main="(d) 散点图")
plot(rnorm(25),rnorm(25),cex=(y+2),col=2:4,lwd=2,xlab="",ylab="",main="(e)气泡图")
plot(density(y),col=4,lwd=1,xlab="",ylab="",main="(f)核密度图");polygon (density(y),col="gold",border="blue")
hist(rnorm(1000),col=3,xlab="",ylab="",main="(g)直方图")
boxplot(x,col=2,main="(h)箱线图")