R语言绘图


本文转载自Category: DataVisualization,对于不明白的地方加了自己检索后的说明。

使用demo(graphics),可以查看R漂亮的图像演示。

1
2
3
4
5
set.seed(1234)
x<-sample(1:100,80,replace = FALSE)
y<-2*x+20+rnorm(80,0,10)
plot(x = x,y = y)
plot(x,y)

其中set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性。如果不设定种子,生成的随机数无法重现。

1
sample(x, size, replace = FALSE, prob = NULL)

x可以是任何对象,
size规定了从对象中抽出多少个数,size应该小于x的规模,否则会报错
replace默认是FALSE,表示每次抽取后的数就不能在下一次被抽取;TRUE表示抽取过的数可以继续拿来被抽取

正态分布随机数rnorm()

句法是:rnorm(n,mean=0,sd=1) 其中n表示生成的随机数数量,mean是正态分布的均值,默认为0,sd是正态分布的标准差,默认时为1

绘制一个最简单的散点图:

1
plot(x=x,y=y)

其中x=x左侧的x表示横坐标,右侧的是数据名,y的相同。当然,x和y都是可以省略的。也可以使用plot(formula)这样的形式去绘制散点图:plot(y~x)

添加标题和标签

1
plot(x,y,xlab="name of x",ylab="name of y",main="Scatter Plot")

设置坐标界限

可先用range(x)range(y)查看x,y的取值范围

1
plot(x,y,xlab="name of x",ylab="name of y",main="Scatter Plot",xlim=c(1,100),ylim=c(0,250))

更改字符

默认情形下,绘图字符为空心点,可以使用pch选项参数进行更改

1
plot(x,y,xlab="name of x",ylab="name of y",main="Scatter Plot",xlim=c(1,100),ylim=c(0,250),pch=19)

pch的取值与其对应的图形字符,也可以使用plot绘制:

1
2
3
4
a<-rep(1:5,each=5)
b<-rep(1:5,5)
plot(a,b,pch=1:25)
text(a,b,1:25,pos=2)

更改颜色

默认情况下,R绘制的图像是黑白的。但其实,R中有若干和颜色相关的参数:

1
plot(x,y,main="Plot",sub="Scatter Plot",col="red",col.axis="green",col.lab="blue",col.main="#999000",col.sub="#000999",fg="gray",bg="white")

其中:

参数 作用
col 绘图字符的颜色
col.axis 坐标轴文字颜色
col.lab 坐标轴标签颜色
col.main 标题颜色
col.sub 副标题颜色
fg 前景色
bg 背景色

更改尺寸

与颜色类似,存在若干参数可以用来设置图形中元素的尺寸,而且与上表中设置颜色的参数相对应,只需将col更换成cex即可:

1
plot(x,y,main="Plot",sub="Scatter Plot",cex=0.5,cex.axis=1,cex.lab=0.8,cex.main=2,cex.sub=1.5)

线

有时候,我们不仅需要散点图,更需要折线图,比如在时间序列当中:

1
2
3
4
t <- 1:50
set.seed(1234)
v<-rnorm(50,0,10)
plot(t,v,type="l")

注意,type的取值:

what type of plot should be drawn. Possible types are

  • “p” for points,
  • “l” for lines,
  • “b” for both,
  • “c” for the lines part alone of “b”,
  • “o” for both ‘overplotted’,
  • “h” for ‘histogram’ like (or ‘high-density’) vertical lines,
  • “s” for stair steps,
  • “S” for other steps, see ‘Details’ below,
  • “n” for no plotting.

更改线条类型

R中提供了很多类型的线条,可以通过lty选项来设定,如下:

1
2
3
a<-c()
plot(a,xlim=c(0,10),ylim=c(1,6),xlab="",ylab = "lty")
for(i in 1:6){abline(h=i,lty=i)}

更改颜色

与前面更改点的颜色方法相同!

线条变宽

1
plot(t,v,type="l",lwd=2)

点与线

有时候,我们还需要将点突出出来,此时需要利用type选型:

1
plot(t,v,type="b")

type选项可以指定plot()函数绘制的类型,可以使用help(plot)查看。

散点图与平滑线

在做线性回归时,我们常常会在散点图中添加一条拟合直线以查看效果:

1
2
3
model <- lm(y~x)
plot(x,y)
abline(model,col="blue")

有时候,我们需要在散点图上画一条拟合的平滑线,一般使用loess:

1
2
3
4
5
plot(x,y)
model_loess<-loess(y~x)
fit<-fitted(model_loess)
ord<-order(x)
lines(x[ord],fit[ord],lwd=2,lty=2,col="blue")

当然,在R语言中要实现上面的图形有很多简单地方法,这里介绍两个:

  1. 使用car包中的scatterplot()函数
1
2
library(car)
scatterplot(y~x,spread=FALSE,lty=1,lwd=2,smoother.args=list(lty=2,lwd=2),smoother=loessLine)

其中,直线为线性拟合,虚线为loess曲线拟合,边界为箱线图!
在函数中smoother.args选项指定曲拟合的参数,smoother选项指定是否使用曲线拟合,以及用什么方法进行曲线拟合。当然,如果不需要曲线平滑拟合,那么可以将smoother=FALSE。
使用以下语句安装需要的软件包

1
install.packages( pkgs = "car", dependencies = TRUE )
  1. 使用ggplot2包
    ggplot2是学习R语言制图的一座大山,它提供了一个基于全面而连贯的语法的绘图系统。功能非常强大,而且弥补了R中自带图形绘制的很多缺点。
    使用这个包,实现的方法一般有两种,就是使用qplot()函数和ggplot()函数
1
qplot(x,y,geom=c("point","smooth"),method="lm",se=FALSE)+geom_smooth(method="loess",color="red",se=FALSE,LTY=2)

或者

1
ggplot(aes(x,y),data=dataSet)+geom_point() + geom_smooth(method="lm",color="green",lty=1,se=FALSE) +geom_smooth(method="loess",color="red",lty=2,se=FALSE)

饼图

饼图,就是将一个圆(或者圆饼)按分类变量分成几块,每一块所占的面积比例就是相对应的变量在总体中所占的比例。

1
2
3
4
5
6
7
8
9
10
year<-2001:2010
set.seed(1234)
counts <- sample(100:500,10)
par("mar")
[1] 5.1 4.1 4.1 2.1
par(mar=c(1,1,1,1))
pie(counts,labels=year)
pie(counts,labels=year,col=gray(seq(0.1,1,length=10)),clockwise = TRUE)
lb <-paste(year,counts,sep=":")
pie(counts,labels=lb,col=rainbow(10))

条形图

条形图就是通过垂直或者水平的条形去展示分类变量的频数。

1
2
3
4
5
6
7
8
9
10
year<-2001:2010
set.seed(1234)
counts <- sample(100:500,10)
par("mar")
[1] 5.1 4.1 4.1 2.1
par(mar=c(1,1,1,1))
barplot(counts,names.arg=year)
barplot(counts,names.arg=year,horiz=TRUE)
barplot(counts,names.arg=year,col = rainbow(10))
barplot(counts,names.arg=year,col = grey(seq(0.1,1,length=10)),horiz=TRUE)

当每一年有两个变量指标时,可以绘制堆砌条形图和分组条形图:

1
2
3
4
5
6
set.seed(4321)
counts2<-sample(100:500,10)
count<-cbind(c1=counts,x2=counts2)
rownames(count)<-year
par(mfrow=c(1,1))
barplot(count,col=rainbow(10),legend=rownames(count))
1
barplot(count,col=rainbow(10),beside = TRUE,legend=rownames(count))

直方图

前面介绍的两种图形,一般都是用来处理离散数据的。那么对于连续数据,常用的图形就有这里所说的直方图。直方图在横轴上将数据值域划分成若干个组别,然后在纵轴上显示其频数。通过这种方式,可以将连续的点离散化,从而来描述连续型变量的分布。
在R语言中,可以使用hist()函数来绘制直方图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
##构造数据
set.seed(1234)
x<-rnorm(100,0,1)
##设置画布
par(mfrow=c(2,2))
##1
hist(x)
box()
##2 修改颜色,组数
hist(x,breaks=10,col="gray")
box()
##3 添加核密度曲线
hist(x,breaks = 10,freq=FALSE,col = "gray")
lines(density(x),col="red",lwd=2)
box()
##4 添加正态密度曲线
h <- hist(x,breaks=10,col="gray")
xfit<-seq(min(x),max(x),length=100)
yfit<-dnorm(xfit,mean = mean(x),sd=sd(x))
yfit<-yfit*diff(h$mids[1:2])*length(x)
lines(xfit,yfit,col="blue",lwd=2)
box()

当然,可以使用ggplot2包中的函数绘制直方图:
先试试qplot()函数:

1
2
x<-rnorm(100,0,1)
qplot(x,geom="histogram",binwidth=0.5,fill=..count..)

再试试ggplot()函数:

1
2
3
4
5
6
7
8
9
x<-rnorm(100,0,1)
dataSet <- data.frame(x)
h<-ggplot(data=dataSet,aes(x=x))
h+geom_histogram(aes(fill=..count..),binwidth = 0.5)
##添加核密度曲线
h+geom_histogram(aes(y=..density..,fill=..count..),binwidth = 0.5)+geom_density(color="red")
##添加正态密度曲线
dataSet2<- data.frame(xfit,yfit)
h+geom_histogram(aes(fill=..count..),binwidth = 0.5)+geom_line(data=dataSet2,aes(x=xfit,y=yfit),color="red")

箱线图

还有一种常用的图形,就是箱线图,也称盒须图。它通过绘制连续型变量的五个分位数(最大最小值、25%和75%分位数以及中位数),描述变量的分布。

1
2
3
4
5
6
7
8
9
x1<-x
x2<-rnorm(100,1,2)
x3<-rnorm(100,2,4)
all_x <- c(x1,x2,x3)
label <- rep(1:3,each=100)
dataSet3<-data.frame(x=all_x,label=label)
boxplot(dataSet3$x)
##考虑类别
boxplot(x~label,data = dataSet3)

基础绘图系统

基础绘图系统,即是R语言自带的绘图系统。R中核心的绘图系统主要基于以下两个包:

  • graphics包,此包包含了基础绘图系统的绘图函数,比如:plot(),hist()等等;
  • grDevices包,此包包含了各类型的图形设备(graphics devices),包括:X11,PDF,PNG等等。

基础绘图系统总是从一幅空画布开始绘制图形,首先使用plot()这样的函数在空画布上画出图形,然后使用注释函数对图形进行添加或者修改,一般来说就是添加或者修改显示的文本、辅助线、辅助点以及标题等等。对于这样的一个流程,它可以很方便我们去使用,因为这样的流程可以完全将我们的思路反应出来。它就是通过一系列的R语言命令,一步一步地按照心中预想的绘图方式将其绘制出来

这样的绘图方式在给予我们方便的同时,也带来了一些弊端。首先,我们必须事先安排好图形应该如何绘制,因为一旦我们开始绘制就不能后退了;此外,当一幅图形绘制完成,我们就不能对其进行修改了,因为基础绘图系统没有绘图语言(graphical “language”)。

基础绘图一般来说:就是使用一系列单独的函数调用,将图形的各个零散的部分组合起来

利用mtcar数据集,做个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 取出感兴趣的数据
dataSet <-mtcars[c("mpg","disp","carb")]
## 转换数据的格式
dataSet<-transform(dataSet,carb=factor(carb))
par(mar=c(1,1,1,1))
## 绘图查看数据 散点图
plot(dataSet$mpg,dataSet$disp,xlab="mpg",ylab="disp")
title("The Scatter Plot")
model<-lm(disp~mpg,data=dataSet)
abline(model,col="red")
## 加上条件
with(dataSet,plot(mpg,disp,type="n"))
for(i in unique(dataSet$carb)){with(subset(dataSet,carb==i),points(mpg,disp,col=i))}
## 对于carb==4的数据,添加拟合直线
model1<-lm(disp~mpg,data=subset(dataSet,carb==4))
abline(model1,lty=2,lwd=2)

Lattice

Lattice一般会使用以下两个包:

  • lattice包:包含于基础绘图独立的,能够生成Trellis graphics的代码,包括xyplot,bwplot等等;
  • grid包:lattice包建立在此包之上,在使用中很少直接调用这个包。

Lattice与基础绘图系统的一个非常明显的区别在于:所有的绘图以及注释都在一次函数调用中完成
Lattice很擅长绘制需要分类的图形,比如说,想要根据不同的level,绘制y与x的散点图。这个在基础绘制系统中还是蛮麻烦的,但是在Lattice中就比较容易。也就是说,Lattice通过一维、二维或三维的条件绘图(即是Trellis),对多元变量关系进行直观展示。
由于其所有的绘图与注释都需要在一次函数调用中完成,所以在使用之前就需要做好准备,因为一旦图形绘制好,就什么也不能添加了,接着上面的数据集做实例:

1
2
3
4
5
6
7
8
9
10
library(lattice)
xyplot(disp~mpg,data=dataSet)
xyplot(disp~mpg|carb,data=dataSet,layout=c(6,1))
## 使用panel function
xyplot(disp~mpg|carb,data=dataSet,panel = function(x,y,...){
panel.xyplot(x,y,...)
panel.abline(h=median(y),lty=2,col="gray")
panel.lmline(x,y,col="red")
})

ggplot2

ggplot2是基于一种全面的图形语法,提供了一种全新的图形创建方法。能够自动处理位置、文本等等注释,也能够按照需求自定义设置。默认情况下有很多选项以供选择,在不设置时会直接使用默认值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
library(ggplot2)
## 查看qplot函数
str(qplot)
## 散点图
qplot(mpg,disp,data=dataSet)
## 按carb区分 按颜色
qplot(mpg,disp,data=dataSet,color=carb)
## 按形状
qplot(mpg,disp,data=dataSet,shape=carb)
## 添加拟合直线
qplot(mpg,disp,data=dataSet,geom=c("point","smooth"),method="lm")
## 使用facets
qplot(mpg,disp,data=dataSet,facets = .~carb)
## 添加颜色和形状
qplot(mpg,disp,data=dataSet,facets = .~carb,color=carb,shape=carb)