本文转载自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: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选项来设定,如下:
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: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))
条形图
条形图就是通过垂直或者水平的条形去展示分类变量的频数。
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)
当每一年有两个变量指标时,可以绘制堆砌条形图和分组条形图:
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))
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))
##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()
函数:
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<-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数据集,做个示例:
## 取出感兴趣的数据
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 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是基于一种全面的图形语法,提供了一种全新的图形创建方法。能够自动处理位置、文本等等注释,也能够按照需求自定义设置。默认情况下有很多选项以供选择,在不设置时会直接使用默认值。
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)