全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
17731 6
2014-08-10
R语言绘图的基础与布局
(一)基础

R语言中的绘图设备(device)有多种,但可以分为两类,一类是绘图文件,另一类是绘图的窗口。
我们可以利用?png来查看png()函数的帮助信息,并会得到更为详细的R中支持的常用绘图文件信息,要更为全面的信息的话,可以使用?device。这里说一下,在R中我们经常会使用?函数名的模式来快速打开关于阐述的使用信息。使用这一类函数打开的设备不会直接显示,所以运行函数后没有明显效果。但是,你已经打开了可用设备,不太明显的查看方式使用dev.list(),可以前后运行这个方法查看差异,关于dev的使用。另外一种,能让你感受到设备一打开的方式是使用x11()/windows()函数,试一下吧,这二者使用上没有区别,前者是Unix/Linux环境下的图形窗口称呼,后者当然就是windows环境下的了。
最后,R语言汇集统计计算与统计图示两种功能于一身,灵活的 面向对象(Object-Oriented,OO)编程方式让我们可以很方便地控制图形输出,从而制作出既精美又专业的统计图形。但是,R绘图的工作方式与变量,数据,函数等对象的处理形式大为不同,显然绘图结果是不能复制给一个对象的,而是直接输出到前面说的绘图设备中。

(二)布局
R绘图所占的区域,被分成两大部分,一是外围边距,一是绘图区域。
这里先简单介绍一下函数par()函数,透过它可以用来设置或者获取图形参数,par()本身(括号中不写任何参数)返回当前的图形参数设置(是一个列表:list);若要设置图形参数,则可用par(tag = value)的形式,其中tag的详细说明非常之多,可以使用?par查看,value便是参数值。
外围边距可使用par()函数中的oma来进行设置。比如oma=c(4,3,2,1),这里的oma即是:out margin area,就是指外围边距分别为下边距:4行,左边距3行,上边距2行,右边距1行,这里的行是指可以显示1行普通字体。注意,设置顺序是从x轴开始顺时针方向。当我们使用mtext中的line参数时,设置的大小就应该是[0,行数)的开区间;当我们使用mtext在外围边距上书写内容时,设置mtext中的outer=TRUE即可。
绘图区域可使用par()函数中的mfrow, mfcol来进行布局。mfrow和mfcol可以使用绘图区域被区分为多个区域。默认值为mfrow(1,1)。比如mfrow(2,3)就是指将绘图区域分成2行3列,并按行的顺序依次绘图填充;比如mfcol(3,2)就是指将绘图区域分成3行2列,并按列的顺序依次绘图填充;使用mfrow,mfcol只能是矩阵似的布局。
我们将每一个细分的绘图区域分为两个部分,一是绘图边距,一是主绘图。绘图边距用来准备坐标轴,坐标轴标签,标题。通常来讲,我们都只需要一个x轴,一个y轴,所以在设置时,一般是下边距和左边距都会大一些。如果多个x轴或者y轴,才考虑将上边距或者右边距放大一些。绘图边距可以使用par()函数中mar来设置。比如mar=c(4,3,2,1),与外围边距的设置类似,是指绘图边距分别为下边距:4行,左边距3行,上边距2行,右边距1行。这个设置顺序与前面提到的一样,也是从x轴开始顺时针方向。行的概念也与之前的相同。也可以使用mai来设置。mai与mar唯一不同之处在于mai不是以行为单位,而是以inch为单位。
这里有一个很好的例子,仔细参考以下例子,参考结果就能对上面干瘪瘪的文字有更加直观的理解O(∩_∩)O~:


SOUTH<-1; WEST<-2; NORTH<-3; EAST<-4;

GenericFigure <- function(ID, size1, size2)
{
  plot(0:10, 0:10, type="n", xlab="X", ylab="Y")
  text(5,5, ID, col="red", cex=size1)
  box("plot", col="red")
  mtext(paste("cex",size2,sep=""), SOUTH, line=3, adj=1.0, cex=size2, col="blue")
  title(paste("title",ID,sep=""))
}

MultipleFigures <- function()
{
  GenericFigure("1", 3, 0.5)
  box("figure", lty="dotted", col="blue")

  GenericFigure("2", 3, 1)
  box("figure", lty="dotted", col="blue")

  GenericFigure("3", 3, 1.5)
  box("figure", lty="dotted", col="blue")

  GenericFigure("4", 3, 2)
  box("figure", lty="dotted", col="blue")
}

par(mfrow=c(2,2),mar=c(6,4,2,1),oma=c(4,3,2,1))

MultipleFigures()

box("inner", lty="dotted", col="green")
box("outer", lty="solid", col="green")

mtext("Outer Margin Area (oma) of South: 6", SOUTH, line=1, cex=1, outer=TRUE)

plotline<-function(n,direc){
  for(i in 0:n){
    mtext(paste("line",i,sep=""), direc, line=i, cex=1, col="black", adj=1, outer=TRUE)
  }
}
plotline(4,SOUTH)














二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-8-10 13:51:07
R绘图的布局排版

  之前提到,mfrow,mfcol只能是矩阵式的布局,如果我们需要简单地实际不规则的布局,怎么办呢?强大的layout(),split.screen()专门用于布局。有资料提到“split.screen()函数与其它函数是不兼容的(比如layout(),coplot()),不可以用于多个绘图设备,而且它们的使用仅限于象图形式探索型数据分析这样的问题”,很晕,搞不懂的+_+...希望有人能指点O(∩_∩)O~。所以这里只介绍强大的layout()函数。
函数layout()把当前的绘图设备分割为多个部分,绘制的图形将一次显示在个恶搞部分中,它主要自变量是一个元素都是整数的的矩阵,元素标识了子窗口(sub-windows)的编号。
layout(mat, widths = rep(1, ncol(mat)), heights = rep(1,nrow(mat)),respect = FALSE)
其中,mat就是一个距阵,假设我们要画N个图,那么,mat就要描述每个图所在的位置,其中1…N-1都必须至少出现过一次。比如有三个图,我们希望的布局是第一排有一个图,第二排有两个图,那么mat<-matrix(c(1,1,2,3), nrow=2, ncol=2, byrow = TRUE);如果希望第一排有两个图,第二排有一个图,那么就是mat<-matrix(c(1,2,3,3),nrow=2,ncol=2,byrow=TRUE)。很明显,还是将画布分成许多小格矩阵,这里就是2x2的,如果希望第1个图放入第一排的1,2格,那就在矩阵的第1,2的位置写入1,如果是希望第2个图放在第一排的1,2格,那就在矩阵的第1,2的位置写入2。另外,在绘图前,如果你想查看一下布局分布的情况,我们可以使用函数layout.show()显示具体的布局,比如上面被分割为三个区域的设备,可以用layout.show(1)显示区域1,layout(3)直接显示全部格局。
attach(mtcars)   #使用attch加载需要的包mtcars包,可以直接使用包里面提供的数据,便于绘图测试
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
hist(wt) #绘制wt的柱形图
hist(mpg)
hist(disp)

layout函数布局0

那么参数中的widths和heights就是用来指定每行或者每列的宽度和高度的。我们可以做以下的比较:
attach(mtcars)  layout(matrix(c(1,1,1,1,2,2,2,3,2,2,2,3),3,4,byrow=TRUE))  
hist(wt)  
hist(mpg)  
hist(disp)  
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)

loyout函数布局1

这两种方法得到的是相同的结果,在代码的书写上,第2种方法要更清晰一些。想象一下,似乎每个图的位置必须是连在一起的小矩阵,如果,不构成连在一起小矩阵,会成为怎么样的一个结果呢?
attach(mtcars)
layout(matrix(c(1,1,2,1,1,1),nrow=2,ncol=3,byrow=T))  
hist(wt)  
hist(mpg)


layout函数布局2

如果需要大图,小图,内嵌图这layout()虽然很容易实现,但多少有点麻烦,不是那么随心所欲。还是回过头来使用par()吧。使用par()的中fig=在画布任意位置上画图。在使用fig参数时,需要把画布理解成左下角为坐标(0,0),右上角为(1,1)的一个坐标系。fig=c(x1,x2,y1,y2)来设置该参,x1<x2,y1<y2,x1,y1定位绘图区的左下角,x2,y2定位绘图区的右上角。使用new=TRUE参数来确认是否在原画布上继续画,还重新在一张新画布上开始画。

par(fig=c(0,0.85,0,0.85), new=F)
plot(mtcars$wt, mtcars$mpg, xlab="Miles Per Gallon",ylab="Car Weight")
par(fig=c(0,0.8,0.55,1), new=TRUE)
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE)
par(fig=c(0.65,1,0,0.8),new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)
par(fig=c(0.4,0.75,0.4,0.7),new=TRUE,mar=c(2,2,0,0),mgp=c(1,.4,0),cex=1,cex.lab=0.7,cex.axis=0.7)
hist(mtcars$mpg, main="")

layout函数布局3


好了,关于R绘图基础和布局的内容先介绍到这里。如果理解错误的地方,希望能过帮忙指正更改。谢谢O(∩_∩)O~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-10 13:51:50
原文链接 http://blog.163.com/wxh244295043@yeah/blog/static/17265801220127207547952/
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-10 15:40:50
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-8-11 13:58:42
请教楼主,下面这个帖子上的问题怎么解决,谢谢先。https://bbs.pinggu.org/thread-3951469-1-1.html
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-15 20:48:24
想请问一下,par(mfrow=c(1,2))后,画出的图是两个长方形的图,怎样让横纵坐标每一格的长度相等啊?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群