飞道的博客

R语言

268人阅读  评论(0)


本篇文章主要参考了《R语言实战》 1这本书。做了一些简化,是笔者学习的笔记,总结,书中例子复现。侵删。

使用图形

> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on weight")
> detach(mtcars)

首句绑定了数据框mtcars。第二条语句打开了一个图形窗口并生成了一幅散点图,横轴表示车 身重量,纵轴为每加仑汽油行驶的英里数。第三句向图形添加了一条最优拟合曲线。第四句添加 了标题。

可以通过代码或图形用户界面来保存图形。要通过代码保存图形,将绘图语句夹在开启目标 图形设备的语句和关闭目标图形设备的语句之间即可。例如:

pdf("mygraph.pdf")
> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on weight")
> detach(mtcars)
dev.off()

除了pdf(),还可以使用函数win.metafile()、png()、jpeg()、bmp()、tiff()、xfig() 和postscript()将图形保存为其他格式。(注意,Windows图元文件格式仅在Windows系统中可 用。)

通过图形用户界面保存图形的方法因系统而异。对于Windows,在图形窗口中选择“文件”→ “另存为”,然后在弹出的对话框中选择想要的格式和保存位置即可。在Mac上,当Quartz图形窗 口处于高亮状态时,点选菜单栏中的“文件”→“另存为”即可。其提供的输出格式仅有PDF。 在UNIX系统中,图形必须使用代码来保存。

通过执行如plot()、hist()(绘制直方图)或boxplot()这样的高级绘图命令来创建一幅 新图形时,通常会覆盖掉先前的图形。如何才能创建多个图形并随时查看每一个呢?方法有若干。

第一种方法,你可以在创建一幅新图形之前打开一个新的图形窗口: 每一幅新图形将出现在最近一次打开的窗口中。

dev.new()
	statements to create graph 1
dev.new()
	statements to create a graph 2
etc.

第二种方法,你可以通过图形用户界面来查看多个图形。在Mac上,你可以使用Quartz菜单 中的“后退”(Back)和“前进”(Forward)来逐个浏览图形。在Windows上,这个过程分为两 步。在打开第一个图形窗口以后,勾选“历史”(History)→“记录”(Recording)。然后使用菜 单中的“上一个”(Previous)和“下一个”(Next)来逐个查看已经绘制的图形。

第三种也是最后一种方法,你可以使用函数dev.new()、dev.next()、dev.prev()、 dev.set()和dev.off()同时打开多个图形窗口,并选择将哪个输出发送到哪个窗口中。这种 方法全平台适用。关于这种方法的更多细节,请参考help(dev.cur)。 R将在保证用户输入最小化的前提下创建尽可能美观的图形。不过你依然可以使用图形参数 来指定字体、颜色、线条类型、坐标轴、参考线和标注。其灵活度足以让我们实现对图形的高度 定制。

一个简单的例子

病人对两种药物五个剂量水平上的响应情况

剂量 对药物A的响应 对药物B的响应
20 16 15
30 20 18
40 27 25
50 40 31
60 60 40

可使用下面代码输入数据,创建一幅描述药物A的剂量和响应关系的图形

> dose<-c(20,30,40,50,60)
> drugA<-c(16,20,27,40,60)
> drugB<-c(15,18,25,31,40)
> plot(dose,drugA,type="b")

plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化)。 本例中,plot(x, y, type=“b”)将x置于横轴,将y置于纵轴,绘制点集(x, y),然后使用线段 将其连接。选项type="b"表示同时绘制点和线。使用help(plot)可以查看其他选项。

图形参数

我们可以通过修改称为图形参数的选项来自定义一幅图形的多个特征(字体、颜色、坐标轴、 标题)。 (修改图形参数的)一种方法是通过函数par()来指定这些选项。以这种方式设定的参数值 除非被再次修改,否则将在会话结束前一直有效。其调用格式为par(optionname=value,optionname=name,…)。不加参数地执行par()将生成一个含有当前图形参数设置的列表。添加 参数no.readonly=TRUE可以生成一个可以修改的当前图形参数列表。

继续上例,假设你想使用实心三角而不是空心圆圈作为点的符号,并且想用虚线代替 实线连接这些点。你可以使用以下代码完成修改:

> opar<-par(no.readonly = TRUE)
> par(lty=2,pch=17)
> plot(dose,drugA,type="b")
> par(opar)

首个语句复制了一份当前的图形参数设置。第二句将默认的线条类型修改为虚线(lty=2) 并将默认的点符号改为了实心三角(pch=17)。然后我们绘制了图形并还原了原始设置。

符号和线条



颜色

文本属性

图形尺寸与边界尺寸

添加文本、自定义坐标轴和图例

除了图形参数,许多高级绘图函数(例如plot、hist、boxplot)也允许自行设定坐标轴 和文本标注选项。举例来说,以下代码在图形上添加了标题(main)、副标题(sub)、坐标轴标 签(xlab、ylab)并指定了坐标轴范围(xlim、ylim)。

plot(dose,drugA,type = "b",col="red",lty=2,pch=2,lwd=2,main="Clinical Trials for DrugA",sub = "This is hypothetical data",xlab = "Dosage",ylab = "Drug Response",xlim = c(0,60),ylim = c(0,70))


注意 某些高级绘图函数已经包含了默认的标题和标签。你可以通过在plot()语句或单独 的par()语句中添加ann=FALSE来移除它们。

标题

可以使用title()函数为图形添加标题和坐标轴标签。调用格式为:

title(main="main title",sub="sub-title",xlab="x-axis label",ylab="y-axis label")

函数title()中亦可指定其他图形参数(如文本大小、字体、旋转角度和颜色)。举例来说, 以下代码将生成红色的标题和蓝色的副标题,以及较默认大小小25%的绿色x轴、y轴标签:

title(main="My Title",col.main="red",sub="My Sub-title",col.sub="blue",xlab="My X label",ylab="My Y label",col.lab="green",cex.lab=0.75)

坐标轴

你可以使用函数axis()来创建自定义的坐标轴,而非使用R中的默认坐标轴。其格式为:

axis(side,at=,labels=,pos=,lty=,col=,las=,tck=,...)

创建自定义坐标轴时,你应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE将禁 用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt="n"和 yaxt="n"将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。

次要刻度线

注意,我们最近创建的图形都只拥有主刻度线,却没有次要刻度线。要创建次要刻度线,你 需要使用Hmisc包中的minor.tick()函数。

library(Hmisc)
minor.tick(nx=n,ny=n,tick.ratio=n)

你可以使用代码: 来添加次要刻度线。其中nx和ny分别指定了X轴和Y轴每两条主刻度线之间通过次要刻度线划分 得到的区间个数。tick.ratio表示次要刻度线相对于主刻度线的大小比例。当前的主刻度线长 度可以使用par(“tck”)获取。举例来说,下列语句将在X轴的每两条主刻度线之间添加1条次要刻度线,并在Y轴的每两条主刻度线之间添加2条次要刻度线:

minor.tick(nx=2,ny=3,tick.ratio=0.5)

次要刻度线的长度将是主刻度线的一半。

参考线

函数abline()可以用来为图形添加参考线。其使用格式为:

abline(h=yvalue,v=xvalue)

函数abline()中也可以指定其他图形参数(如线条类型、颜色和宽度)。

图例

当图形中包含的数据不止一组时,图例可以帮助你辨别出每个条形、扇形区域或折线各代表 哪一类数据。我们可以使用函数legend()来添加图例(果然不出所料)。其使用格式为:

legend(location,title,legend)

其他常用的图例选项包括用于指定盒子样式的bty、指定背景色的bg、指定大小的cex,以 及指定文本颜色的text.col。指定horiz=TRUE将会水平放置图例,而不是垂直放置。

举一个例子

> dose<-c(20,30,40,45,60)
> drugA<-c(16,20,27,40,60)
> drugB<-c(15,18,25,31,40)
> opar<-par(no.readonly = TRUE)
> par(lwd=2,cex=1.5,font.lab=2)  #增加线条、文本、符号、标签的宽度或大小
> plot(dose,drugA,type="b",pch=15,lty=1,col="red",ylim=c(0,60),main="DrugA vs.DrugB") #绘制图形
> lines(dose,drugB,type="b",pch=17,lty=2,col="blue")
> abline(h=c(30),lwd=1.5,lty=2,col="gray")
>library(Hmisc)
> minor.tick(nx=3,ny=3,tick.ratio = 0.5)#添加次要刻度线
> legend("topleft",inset = .05,title = "Drug Type",c("A","B"),lty=c(1,2),pch=c(15,17),col=c("red","blue"))#添加图例
> par(opar)

文本标注

我们可以通过函数text()和mtext()将文本添加到图形上。text()可向绘图区域内部添加 文本,而mtext()则向图形的四个边界之一添加文本。使用格式分别为:

text(location,“text to place",pos,...)
mtext("text to place",side,line=n,...)


其他常用的选项有cex、col和font(分别用来调整字号、颜色和字体样式)。 除了用来添加文本标注以外,text()函数也通常用来标示图形中的点。我们只需指定一系 列的x, y坐标作为位置参数,同时以向量的形式指定要放置的文本。x、y和文本标签向量的长度 应当相同。

> attach(mtcars)
> plot(wt,mpg,main = "Mileage vs.Car Weight",xlab = "Weight",ylab = "Mileage",pch=18,col="blue")
> text(wt,mpg,row.names(mtcars),cex = 0.6,pos = 4,col = "red")
> detach(mtcars)

这里,我们针对数据框mtcars提供的32种车型的车重和每加仑汽油行驶英里数绘制了散点图。 函数text()被用来在各个数据点右侧添加车辆型号。各点的标签大小被缩小了40%,颜色为红色。

> par<-par(no.readonly = TRUE)
> par(cex=1.5)
> plot(1:7,1:7,type = "n")
> text(3,3,"Example of default text")
> text(4,4,family="mono","Example of mono-spaced text")
> text(5,5,family="serif","Example of serif text")

数学标注

最后,你可以使用类似于TeX中的写法为图形添加数学符号和公式。请参阅help(plotmath) 以获得更多细节和示例。要即时看效果,可以尝试执行demo(plotmath)。

图形组合

在R中使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形。

你可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为 nrows、列数为ncols的图形矩阵。另外,可以使用nfcol=c(nrows, ncols)按列填充矩阵。

attach(mtcars)
opar<-par(no.readonly = TRUE)
par(mfrow=c(2,2))
plot(wt,mpg,main="Scatterplot of wt vs.mpg")
plot(wt,disp,mian="Scatterplot of wt vs disp")
hist(wt,main="Histogram of wt")
boxplot(wt,main="Boxplot of wt")
par(opar)
detach(mtcars)

attach(mtcars)
opar<-par(no.readonly = TRUE)
par(mfrow=c(3,1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)

请注意,高级绘图函数hist()包含了一个默认的标题(使用main="" 可以禁用它,抑或使用ann=FALSE来禁用所有标题和标签)。


  1. R语言实战 [美] Robert I. Kabacoff ↩︎


转载:https://blog.csdn.net/weixin_47185558/article/details/114060598
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场