APP下载

R软件在多子图绘制中的应用

2019-10-08李洪毅

关键词:绘图绘制布局

李洪毅

(吉首大学 数学与统计学院,湖南 吉首 416000)

随着计算机技术的快速发展,在经济与金融、医学、工程、社会科学等诸多领域的数据分析都离不开统计软件.常用的统计软件有R,SAS,Matlab等.R软件是一个自由、免费、开源的统计软件,关于R软件在各领域运用的研究,已具有丰富的研究成果,常文文、魏立力对一类可修复系统的可靠性建模,给出了系统可靠性的完整算法并通过R软件进行了系统模拟[1].张孔生利用软件近似计算某些特殊类型的二重积分[2].张娇霞通过R软件对定性数据分析中的Logistic回归模型进行模型建立及预测拟合[3].黄雅楠介绍了经典的两个服务员的并联系统同时更新该系统并给出算法,并利用R软件对系统进行模拟[4].金英良等基于R软件实现了Kruskal-Wallis秩和检验的多重比较[5].史景宁等介绍了一种使用

统计分析软件R测量年轮宽度的方法[6].熊炳忠利用R软件的强大计算与绘图功能,给出金融资产收益波动率各个模型的模拟实现以及对实际金融市场数据的各种建模分析[7].苏连塔利用R软件对线性回归模型的选择是否合适,模型的误差项是否满足独立性、等方差性、正态性及模型是否存在异常样本等问题实行回归诊断.R软件除了有强大的统计模型实现和数据模拟功能,同时还拥有优秀的统计制图功能[8-11],受到广大统计研究工作者的青睐.Tiobe在2019年3月所公布最新一期的编程语言排行榜上,R语言位列第14位.在数值模拟和统计分析中的很多结果都需要用图形进行展示,特别是在有多个输出结果或结果之间进行比较的情形下,需要在一幅图形中绘制多个子图.本文结合实例详细地介绍了R软件在多子图绘制中的应用.

1 基于函数par( )中的mfrow或mfcol参数实现多子图布局和绘制

R软件有非常强大的绘图功能,利用简单的几行代码就可以绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,例如在一幅图形中绘制多个子图.这就用到了“强大”的函数par( ),利用par( )还可以很好地解决坐标轴或者标题出界了,或者图例说明的大小或者位置遮挡住了图形,设置颜色等问题,通过设定函数par( )的各参数来调整图形.

函数par( )的使用格式如下:

par(...,no.readonly=FALSE)

其中...表示所有类似于tag=value形式的参数.当参数no.readonly=TRUE时,函数par( )就只允许有这一个参数了,并且会返回当前绘图设备中各个参数的参数值.

多图环境用参数mfrow或参数mfcol来设定,如:

par(mforw=c(2,3))

则是在同一绘图区中绘制2行3列共6个子图图形,而且是先按行绘制,即绘制完第1行的3个图形后,再绘制第2行的3个图形类似的,par(mfcol=c(2,3))

也是绘制2行3列共6个图形,与上面不同的是,先按列绘制.即先绘制完第1列的2个图形,再绘制第2列的2个图形,最后绘制第3列的2个图形.

如果想了解更多关于函数par( )的用法,可输入:

>help(par)或>?par( )

可以查到该函数的具体用法.

例1 设置一个2×2的多图窗口,分别绘制y=cosx-x,y=sinx,y=sinxcosx和y=4/cos(2-x)的图像,定义域为[0,2π].

编写R程序如下:

par(mfrow=c(2,2))#设置屏幕为2×2的多图窗口

x=seq(0,2*pi,by=pi/20)

plot(x,cos(x)-x,type="l",col=2)

plot(x,sin(x),type="l",col=3)

plot(x,sin(x)*cos(x),type="l",col=4)

plot(x,4/cos(2-x),type="l",col=6)

绘图结果如图1:

图1 R软件中输出例1中绘制的图形

2 基于函数split.screen( )实现多子图布局和绘制

2.1 常规布局

函数split.screen( )可以方便地分割当前的绘图屏幕,利用函数split.screen( )进行屏幕分割时,需要结合函数screen( )选择绘图区域、函数split.screen( )和screen( )一般用法分别为:

split.screen(figs,screen,erase=TRUE)

screen(n=,new=TRUE)

针对例1中的问题,编写R程序如下:

x=seq(0,2*pi,by=pi/20)

split.screen(c(2,2)) #设置屏幕为2×2的多图窗口

screen(1)#屏幕子针指向子屏幕1

plot(x,cos(x)-x,type="l",col=2)

screen(2)#屏幕子针指向子屏幕2

plot(x,sin(x),type="l",col=3)

screen(3)#屏幕子针指向子屏幕3

plot(x,sin(x)*cos(x),type="l",col=4)

screen(4)#屏幕子针指向子屏幕4

plot(x,4/cos(2-x),type="l",col=6)

绘图结果如图2所示.

2.2 基于函数split.screen( )实现多子图的复杂布局

利用函数split.screen( )分割屏幕时,其子屏幕也可以被split.screen( )进一步划分,从而可以作出复杂的布局.针对例1中的四个函数,可以作出如下复杂布局.

图2 利用split.screen( )函数作出复杂的布局并绘制例1中的图形

上述图形的R程序编写如下:

x=seq(0,2*pi,by=pi/20)

split.screen(c(2,1)) #设置屏幕为2×1的多图窗口

screen(1)#屏幕子针指向子屏幕1

plot(x,cos(x)-x,type="l",col=2)

screen(2)#屏幕子针指向子屏幕2

split.screen(c(1,3)) #设置子屏幕2为1×3的多图窗口

screen(3)#屏幕子针指向子屏幕3

plot(x,sin(x),type="l",col=3)

screen(4)#屏幕子针指向子屏幕4

plot(x,sin(x)*cos(x),type="l",col=4)

screen(5)#屏幕子针指向子屏幕5

plot(x,4/cos(2-x),type="l",col=6)

2.3 常规布局

函数layout( )也可以便捷地实现绘图屏幕的分割,利用函数layout( )进行屏幕分割时,相当于把子图与矩阵的元素进行对应,因此需要结合matrix( )进行屏幕分割.函数layout( )和matrix( )一般用法分别为:

layout(mat,widths=rep.int(1,ncol(mat)),heights=rep.int(1,nrow(mat)),respect=FALSE)

matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)

基于函数layout( )进行屏幕分割后,利用函数layout.show( )可以查看所创建的屏幕分割.针对例1中的问题,编写R程序如下:

x=seq(0,2*pi,by=pi/20)

mat=matrix(1:4,2,2)#生产一个2×2的矩阵,其元素为1,2,3,4且按列排列

layout(mat)#设置屏幕为2×2的多图窗口,其子屏幕与矩阵mat中的元素对应.

layout.show(4)#查看所创建的屏幕分割

利用函数layout( )实现绘图屏幕的分割后,可依次调用绘图函数,子图依次输出在子屏幕1,2,3,4上,其绘图结果如图3所示.

plot(x,cos(x)-x,type="l",col=2) #图形输出在子屏幕1上

plot(x,sin(x),type="l",col=3) #图形输出在子屏幕2上

plot(x,sin(x)*cos(x),type="l",col=4) #图形输出在子屏幕3上

plot(x,4/cos(2-x),type="l",col=6) #图形输出在子屏幕4上

图3 利用layout( )函数对屏幕分割的结果

2.4 基于函数layout( )实现多子图的复杂布局

利用函数layout( )实现绘图屏幕分割时,可以对参数widths和heights进行设置,可以作出复杂的布局.针对例1中的问题,可以作出图4布局.

图4的R程序编写如下:

x=seq(0,2*pi,by=pi/20)

mat=matrix(1:4,2,2)#生产一个2×2的矩阵,其元素为1,2,3,4且按列排列

layout(mat,widths=c(1,2),heights=c(2,1))#设置屏幕为2×2的多图窗口,其宽度比为1∶2,高度比为2∶1

plot(x,cos(x)-x,type="l",col=2) #图形输出在子屏幕1上

plot(x,sin(x),type="l",col=3) #图形输出在子屏幕2上

plot(x,sin(x)*cos(x),type="l",col=4) #图形输出在子屏幕3上

plot(x,4/cos(2-x),type="l",col=6) #图形输出在子屏幕4上

利用函数layout( )实现绘图屏幕分割时,可以通过函数matrix( )生成的矩阵中包含重复的元素或0元素,也可以作出复杂的布局.

例2 通过函数matrix( )生成的矩阵中包含重复的元素1,绘制例1中的图形,其R代码如下:

mat=matrix(c(1,1,1:4),2,3,byrow=T)#生产一个2×3的矩阵,其元素为1,1,1,2,3,4且按行列排列

layout(mat)#设置屏幕为2×3的多图窗口,其子屏幕与矩阵mat中的元素对应

再依次调用例1中的plot绘图函数,其绘图结果如图2所示.

例3 通过函数matrix( )生成的矩阵中包含元素0,绘制例1中的图形,其R代码如下.

mat=matrix(c(0,1,1:4),2,3,byrow=T)#生产一个2×3的矩阵,其元素为0,1,1,2,3,4且按行列排列

layout(mat)#设置屏幕为2×3的多图窗口,其子屏幕与矩阵mat中的元素对应

再依次调用例1中的plot绘图函数,其绘图结果如图5所示.

图4 利用layout( )函数作出复杂的布局并绘制例1中的图形

图5 利用layout( )函数作出复杂的布局并绘制例1中的图形

3 结束语

本文结合实例详细地介绍了R软件在多子图绘制中的具体应用,根据文中的例子发现:R软件可以非常高效、便捷地解决一幅图形中包含多个子图的绘制问题.教学实践和研究实践证明,R软件可以成为统计学、数学专业课程教学和科学研究中的有力工具,一方面可以加深学生对统计方法的理解,更好地掌握统计理论方法,另一方面还可以通过R软件优秀的图形功能使学生加深统计理论方法的理解和统计结果的展示和解读,使学生能更好地处理实际问题,并且可以激发学生学习的兴趣,增加第二课堂学习的动力,从而为更好地应用专业知识处理实际生活中的问题奠定坚实的基础.

猜你喜欢

绘图绘制布局
来自河流的你
“禾下乘凉图”绘图人
超萌小鹿课程表
垂涎三尺
放学后
BP的可再生能源布局
VR布局
2015 我们这样布局在探索中寻找突破
Face++:布局刷脸生态
在转变中绘制新蓝图