R语言绘图

来源:互联网 发布:儿童绘画软件免费下载 编辑:程序博客网 时间:2024/05/16 07:33

本文转载自http://jackycode.github.io/blog/categories/datavisualization/,版权归期所有。有些地方自己没看懂,通过检索后添加了一些注释。

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(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性。如果不设定种子,生成的随机数无法重现。

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

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

plot(x=x,y=y)

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

添加标题和标签

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

设置坐标界限

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

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

更改字符

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

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绘制:

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中有若干和颜色相关的参数:

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即可:

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)

线

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

t <- 1:50set.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选项来设定,如下:

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)}

更改颜色

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

线条变宽

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

点与线

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

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

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

散点图与平滑线

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

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

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

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语言中要实现上面的图形有很多简单地方法,这里介绍两个:

使用car包中的scatterplot()函数

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。
使用以下语句安装需要的软件包

install.packages( pkgs = "car", dependencies = TRUE ) 

使用ggplot2包
ggplot2是学习R语言制图的一座大山,它提供了一个基于全面而连贯的语法的绘图系统。功能非常强大,而且弥补了R中自带图形绘制的很多缺点。
使用这个包,实现的方法一般有两种,就是使用qplot()函数和ggplot()函数

qplot(x,y,geom=c("point","smooth"),method="lm",se=FALSE)+geom_smooth(method="loess",color="red",se=FALSE,LTY=2)

或者

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)

饼图

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

year<-2001:2010set.seed(1234)counts <- sample(100:500,10)par("mar")[1] 5.1 4.1 4.1 2.1par(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))

条形图

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

year<-2001:2010set.seed(1234)counts <- sample(100:500,10)par("mar")[1] 5.1 4.1 4.1 2.1par(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)

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

set.seed(4321)counts2<-sample(100:500,10)count<-cbind(c1=counts,x2=counts2)rownames(count)<-yearpar(mfrow=c(1,1))barplot(count,col=rainbow(10),legend=rownames(count))
barplot(count,col=rainbow(10),beside = TRUE,legend=rownames(count))

直方图

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

##构造数据set.seed(1234)x<-rnorm(100,0,1)##设置画布par(mfrow=c(2,2))##1hist(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()函数:

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

再试试ggplot()函数:

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%分位数以及中位数),描述变量的分布。

x1<-xx2<-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数据集,做个示例:

## 取出感兴趣的数据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),对多元变量关系进行直观展示。
由于其所有的绘图与注释都需要在一次函数调用中完成,所以在使用之前就需要做好准备,因为一旦图形绘制好,就什么也不能添加了,接着上面的数据集做实例:

library(lattice)xyplot(disp~mpg,data=dataSet)xyplot(disp~mpg|carb,data=dataSet,layout=c(6,1))## 使用panel functionxyplot(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是基于一种全面的图形语法,提供了一种全新的图形创建方法。能够自动处理位置、文本等等注释,也能够按照需求自定义设置。默认情况下有很多选项以供选择,在不设置时会直接使用默认值。

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")## 使用facetsqplot(mpg,disp,data=dataSet,facets = .~carb)## 添加颜色和形状qplot(mpg,disp,data=dataSet,facets = .~carb,color=carb,shape=carb)
0 0