[关闭]
@evilking 2018-05-19T09:43:22.000000Z 字数 2853 阅读 1518

R基础篇

绘图

R有着非常丰富的绘图功能,本篇会介绍一些基础的绘图功能

如果想绘出更加绚丽多彩的图像,我们会再绘图篇中用专门的几个篇章来详细介绍ggplot2绘图

数据准备

本篇绘图所需的数据用R中自带的datasets包中的cars数据,这个数据由50个汽车速度和刹车距离的观察值组成:

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10
>

绘图

> x <- cars$speed    #提取速度
> y <- cars$dist    #提取刹车距离

> plot(x,y)    #以x向量为横轴,y向量为纵轴画图
>

最简单的plot绘图

plot(x,y)是一个泛型函数,它本身可以看成是一个占位符,因为在使用plot()时,真正被调用的函数依赖于对象所属的类

默认情况下,执行完这一句后,会弹出一个新的窗口,并且绘制出对应的(x,y)点集,结果如上图


可以看到最简单的绘图,所有的点集是直接以点的形式绘上去的,如果我想使用线的形式连接这些点呢,或者改变x轴和y轴的描述呢,或者改变x轴和y轴的取值范围呢,于是我们可以如下面来修改plot()函数的参数:

> plot(x,y, type = 'l', xlab = "speed", ylab = "dist", xlim = c(0,40), ylim = c(0,200))
> 

修改横纵轴后的图形

参数type表示绘图的类型,比如这里的'l'表示用直线来连接这些点

参数xlab和ylab分别代表x轴和y轴的描述,如这里的"speed"和"dist"

参数xlim和ylim分别代表x轴和y轴的取值范围,例如这里看到x轴的取值变成了0到40,y轴的取值范围变成了0到200


默认的绘图窗口背景为白色,折线颜色为黑色,如果我想改变这两部分的颜色呢,如下代码所示:

> par(bg = "blue")

> plot(x,y, type = 'l', xlab = "speed", ylab = "dist", col = "red")
> 

改变颜色后的图形

关于窗口的设置,是用par()函数来设置,可设置背景色,前景色,窗口的分区数等等,详细的可以通过help("par")来查看

这里通过设置par()函数的bg参数为"blue"来设置窗口的背景色为蓝色;通过设置plot()函数的col参数为"red"来设置线条的颜色为红色

> par_org <- par(bg = "blue") #改变par()参数设置并返回改变之前的所有参数

> par(par_org)  #利用保存的改变之前的所有参数来恢复改变
> 

其中需要注意的是par()函数设置的所有改变,会对后面创建的所有窗口都会产生影响,所以参数改了的记得改回来


有了元素的数据图形,如果我想在同一个窗口中绘制speed和dist的线性拟合曲线呢,如下:

> plot(x,y,xlab = "speed", ylab = "dist")

> lmout <- lm(y ~ x)    #一元线性回归

> abline(lmout,col = "yellow")  #在上面plot绘制的窗口上绘出拟合曲线
>

添加拟合曲线

lm()函数是用来做回归分析的,我们会在后面回归分析篇中详细讲解,现在只需要知道返回值lmout中包含了回归曲线的点集

abline()函数表示在上面的plot()函数绘制的图形窗口中再添加一条直线,需要注意的是,abline()函数不会自己去创建绘图窗口,而是在已有的绘图窗口上绘制直线


实际应用中我们往往需要把多条不同含义的曲线放在一个图上进行比较,这个时候就需要用到lines()函数

> lines(x,x/2,col = "red")
> lines(x,x/4,col = "blue")
> lines(x,2*x,col = "green")
> 

添加多条曲线

lines()函数可以绘制多条曲线;与abline()一样,该函数不会自己创建绘图窗口


目前你绘制的图形,不管调用几次plot()函数,都是在一个窗口上绘制,后面调用的plot()绘制的图形会覆盖之前的绘制,如果我不想覆盖原来的图形,这个时候有两种做法,第一是重新开一个绘图窗口,第二是将原来的绘图窗口分成几个部分,每一个plot()函数绘制的结果展示在其中一部分上,如下面代码所示:

> len <- length(x)

> plot(1:len, x, type = 'l', main = 'One Graph')    #绘制第一幅图形

> dev.new()    #新开一个绘图窗口
NULL

> plot(1:len, y, type = 'l', main = 'Two Graph')    #在新开的绘图窗口上绘制第二幅图形
>

第一个窗口绘图

第二个窗口绘图

dev.new()函数表示新创建一个绘图窗口,并将新创建的绘图窗口当做当前活动窗口

plot()绘制其实是绘制在当前活动窗口上的;如果当前没有窗口,则会先创建一个窗口,然后再绘制图形;如果有绘图窗口,则先激活绘图窗口成当前活动窗口,然后再绘制

> len <- length(x)

> par2 <- par(mfrow = c(1,2))  #设置窗口为1行、2列的两个分区部分

> plot(1:len, x, type = 'l', main = 'One Graph')    #在第一个部分绘图

> plot(1:len, y, type = 'l', main = 'Two Graph')    #在第二个部分绘图

> par(par2)    #恢复par()设置
>

分区绘图

par()函数有个参数mfrow,可以将绘图窗口分成多个部分,如这里将绘图窗口分成了1行、2列的分区,然后分别依次在各个分区上绘图


当一幅图中有多条曲线时,我想添加图例,去标注每条曲线代表的含义,或者我想标注曲线上某个点代表的含义,那又该如何设置呢:

> plot(x,y, type = 'l', xlab = "speed", ylab = "dist", col = "red")

> legend('topleft',legend = 'speed and dist regression graph')    #添加图例

> text(10,20,'lable1')   #添加文本标签

> text(20,80,'lable2',cex = 2.5)  #改变字体大小的文本标签
> 

上面的几个函数详细介绍可以使用help("legend")函数来查看,或者在R会话中键入example(legend)可以查看R自带的关于添加图例的示例代码

text(x,y,label,cex)函数可以在(x,y)处设置字符串为label的文本,文本的大小比例为cex值

上面的定位可以直接输入(x,y)坐标,但是往往我们并不知道具体的需要标注的点的坐标,这个时候可以使用locator(n)函数用鼠标手动的选中n个点,函数返回的是这n个被选中点的坐标;这样就可以更加精确的定位


最后,我们绘制好了图形,需要持久化的保存到磁盘上,有两种方法:

第一种是R脚本的编辑功能自带的功能,例如RStudio有Export选项,可选则"Save as Image"或者"Save as PDF"

第二种是利用R语句来实现保存

详细的关于如何保存这里就不细说,一般我们用R语言的IDE工具实现保存图形就可以了,读者可以参考网友总结的http://blog.csdn.net/longbless/article/details/6373291

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注