R语言graphics绘图原理

2022-07-12  本文已影响0人  Bioinfor生信云

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)箱线图")
上一篇下一篇

猜你喜欢

热点阅读