先了解一个概念:函数。简单地说,把一些R语句(赋值、计算或其他操作步骤)包装起来并给它一个名称,这就是函数。我们前面接触过的getClass( ), class( ), head( ), rep( ), cbind( ), rbind( )等都是函数。显示(打印)对象也有函数print( ),但R有更简单的方法:输入对象名(数据对象或函数名)就可以显示其内容。函数一般都有参数。
R作图也是通过函数完成的,不同函数可以做出不同的图形,比如plot()函数可以做散点图、线状图,barplot()函数可以做出柱状图或条形图,pie()函数用于做饼形图。作图或者称数据可视化,是R的主要的功能之一。R语言虽然是一种计算机语言,但用R作图不一定要会编程,相当简单。
散点图是最基本的数据分析图形,我们就从它开始。
一、文件数据读取和保存
作图首先要有数据。为避免重复输入,我们一般将R使用的数据存成文本文件(txt文件)或逗号分隔符文件(csv文件),Excel里面有这样的保存选项。
好的R软件包一般都提供有一些供学习和举例用的样本数据,这些数据可以用data( )函数来查询。为方便说明,我们使用R(base包)提供的样本数据。先看看有些什么:
- > data()
- Data sets in package 'datasets':
- AirPassengers Monthly Airline Passenger Numbers 1949-1960
- BJsales Sales Data with Leading Indicator
- BJsales.lead (BJsales)
- Sales Data with Leading Indicator
- BOD Biochemical Oxygen Demand
- CO2 Carbon Dioxide Uptake in Grass Plants
- ChickWeight Weight versus age of chicks on different diets
- DNase Elisa assay of DNase
#...........(还有很多,节省篇幅不列了)
我们用trees数据来做散点图。先看看它是什么样的数据:
- > str(trees) #数据的结构
- 'data.frame': 31 obs. of 3 variables:
- $ Girth : num 8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
- $ Height: num 70 65 63 72 81 83 66 75 80 75 ...
- $ Volume: num 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
- > head(trees) #数据的前几条记录
- Girth Height Volume
- 1 8.3 70 10.3
- 2 8.6 65 10.3
- 3 8.8 63 10.2
- 4 10.5 72 16.4
- 5 10.7 81 18.8
- 6 10.8 83 19.7
可以看到trees数据集是我们比较熟悉的数据框类型,有3个列变量。我们把它保存到D盘根目录。首先用setwd( )函数设置工作目录,它是R读取和保存文件的默认位置。注意:如果是反斜杠得用两个。下面两条语句效果都一样:
- > setwd("d:/")
- > setwd("d:\\")
然后用write.csv( )函数保存成trees.csv文件:
- > write.csv(trees, "trees.csv")
用read.csv( )函数读取数据到the.data中:
- > the.data str(the.data)
- 'data.frame': 31 obs. of 4 variables:
- $ X : int 1 2 3 4 5 6 7 8 9 10 ...
- $ Girth : num 8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
- $ Height: int 70 65 63 72 81 83 66 75 80 75 ...
- $ Volume: num 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
- > head(the.data)
- X Girth Height Volume
- 1 1 8.3 70 10.3
- 2 2 8.6 65 10.3
- 3 3 8.8 63 10.2
- 4 4 10.5 72 16.4
- 5 5 10.7 81 18.8
- 6 6 10.8 83 19.7
read.csv函数读入的数据是数据框,多了表示序号的一列,不影响。如果嫌碍眼就去掉它。
- > the.data <- the.data[ ,2:ncol(the.data)]
二、快速作图法
用plot函数可以非常便捷地做出散点图:
- > x y plot(x, y, main = "树围与树高关系图", xlab = "Girth", ylab = "Height")
R的快速作图方式主要是针对数据关系的探索性分析的,不同类型的图完全可以显示出数据间的关系,同时避免了浪费时间在图形外观的设置上。如果想美化图形,也很容易。图形元素无非包括标题、坐标轴、点、线、图例等几个部分,外观包括形状、颜色、大小、宽度和字体等。
1、标题文字设置参数:main(主标题),sub(副标题),xlab(x轴标题)和ylab(y轴标题)
2、坐标轴有无:axes (TRUE/FALSE)
3、坐标轴区间参数:xlim,ylim
4、点类型参数:pch
5、线类型、宽度参数:lty,lwd
6、颜色设置参数:col, col.axis, col.lab, col.main, col.sub
7、大小(包括图形和字体)参数:cex, cex.axis, cex.main, cex.sub, cex.lab
8、如果点类型是空心点(pch=21-25),还可以设置内部填充颜色:bg参数
我们通过设置plot函数的参数做一个散点图:
- > plot(x, y, main = "树围与树高关系图", xlab = "Girth", ylab = "Height",
- xlim = c(0,25), #设置x轴刻度范围
- pch = 2, col = "red", cex = 1.2, #设置图形几何形状和颜色
- col.lab = "blue", col.axis = "orange",
- cex.lab = 1.2, cex.main = 1.5)
为了避免输入错误后重复打字,一般先把绘图语句写到文本文件,然后拷贝到R里面就可以了。有关的文本编辑器后面再推荐和介绍,现在可以先用自己熟悉的任何文本编辑器做这个事情。
三、分步作图法
上面的图形可以一步步进行。
1、先绘制只设置了点的图,轴不显示,坐标标题为空:
- > plot(x, y, pch = 2, col = "red", axes =FALSE, xlab="", ylab="")
2、添加其他图形元素(注意每执行一条语句后图形会马上有变化,中间过程的图形就不一一贴出了):
- > plot(x, y, pch = 6, col = "red", axes =FALSE, xlab="", ylab="", xlim=c(8,22), ylim=c(10,90))
- > box(col="green")
- > axis(1, col="orange", lty=2, lwd=3)
- > axis(2, col="purple", col.axis="purple")
- > axis(4, col="seagreen")
- > title(main="树围与树高关系图", cex.main = 1.5)
- > title(xlab="Girth", cex.lab=1.2, col.lab="blue")
可以看到,分步作图法可以获得对图形元素的更多控制,各个坐标轴、标签的颜色和字体大小都可以单独设置。还可以在上面图形的基础上添加其他的数据点(在前面作图时注意设置y轴的范围):
- > y2 points(x, y2, pch=25, col="red", bg="blue")
- > title(ylab="Height or Volume", cex.lab=1.2, col.lab="red")
注意:plot( )函数执行后会把图形区的其他东西全“擦”掉再新作图,这样的图形函数称为高水平图形函数;而box( ), title( ), axis( ), points( )这些函数只是在原有图形基础上添加东西,它们称为低水平图形函数。只有使用了高级图形函数产生图形区后才能使用低水平图形函数。各图形元素的低水平图形函数有:
1、添加标题(主、副标题和坐标轴标题):title( )
2、添加坐标轴:axis( )
3、添加数据点:points( )
4、添加线:lines( )
5、添加水平线或垂直线:abline( )
6、其他text( ), polygon( ), legend( )在后面介绍。
四、R base函数作图的特点
以上方法是用都是R基本绘图包(graphics包,已包含在R基本安装包里面)带的作图函数来做的,这个过程就像拿起画笔在一张白纸上画画,每个图形元素都可以自己去设计。因此R graphics包作图的特点也就体现出来了:R提供了丰富的图元控制函数和参数,可以方便地描绘出所需的每个元素。但是和我们普通作图不一样的是,R作图没有橡皮擦,做错了只能重新来过。但这应该不是什么问题,R作图是用语句来进行的,重用这些语句可以绘制出完全一样的图,这点正是科学绘图所需要的。
但是,R把图形元素的控制全交给了我们,虽然很自由,是不是也很麻烦?这恐怕也是很多人学R作图过程中退却的原因吧?但这些设置是有懒办法的:把常用的作图参数设置好并作为函数封装起来(类似与一些软件的宏操作),这样就可以一劳永逸了。《用R语言绘制y轴不连续的柱形图》中自编的gap.bar函数就是这样的一个例子,函数自定义的方法请参考《R语言基础教程6:程序设计基础》部分。
原文来自:http://blog.csdn.net/u014801157/article/details/24372325