先了解一个概念:函数。简单地说,把一些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 <- read.csv("trees.csv", header = TRUE)
再看看读入的数据是什么样子:
> 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 <- the.data$Girth
> y <- the.data$Height
> 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 <- the.data$Volume> 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作图过程中退却的原因吧?但这些设置是有懒办法的:把常用的作图参数设置好并作为函数封装起来(类似与一些软件的宏操作),这样就可以一劳永逸了。这是后话。