高级格函数(Lattice Function)
多面板散点图
setwd("E:/R/R-beginer-guide/data/RBook")
Env <- read.table(file="RIKZENV.txt",header=TRUE)
Env$MyTime <- Env$Year+Env$dDay3/365 #生成一个代表时间天数的新变量
library(lattice) #载入
xyplot(SAL ~ MyTime | factor(Station),type="1",
strip = function(bg,...)
strip.default(bg='white',...),
col.line=1,data=Env) #SAL为y,MyTime为x,factor(Station)为条件变量,作用是生成多面板
strip函数表示对每一个带使用白色背景,col.line=1,对图形使用黑色的线条
其中例如type="r"为回归线,smooth为LOESS拟合,g为增加一个参考网格,l则是将点用线连起来,a是将每个面板中每组均值用线连起来 当使用连续变量时,会被默认为每个值都为离散值,因此需要将其分割为区间,函数single和equal.count可以完成该任务
参数strip需要包含一个F或T来说明是否绘制这个带状,以下是不同的命令绘制图有所区别:
xyplot(SAL ~ MyTime | factor(Station),data=Env)
xyplot(SAL ~ MyTime | factor(Station),type="1",strip=TRUE,col.line = 1,data=Env)
xyplot(SAL ~ MyTime | factor(Station),type="1",strip=FALSE,col.line = 1,data=Env)
多面板盒形图:bwplot
bwplot(SAL ~ factor(Month)|Area ,strip=strip.custom(bg='white'),
cex=0.5,layout=c(2,5),data=Env,xlab="Month",ylab="Salinity",
par.settings=list(
box.rectangle = list(col=1),
box.umbrella = list(col = 1),
box.symbol = list(cex = 0.5,col =1)
)) #条件变量是Area,背景是白色,layout来设置面板的布局指定矩形网格的行数和列数,par.settings=list用来设置盒形框的颜色,线条(伞形物),开放式圆圈(代表中位数)的尺寸和颜色
多面板克里兰夫点图
dotplot(factor(Month)~SAL|Station,
subset= Area=="OS",jitter.x=TRUE,
col=1,data=Env,strip=strip.custom(bg='white'),
cex=0.5,ylab="Month",xlab="Salinity") #factor(Month)为y,SAL为x,Station为条件变量, subset= Area=="OS"的意思是选取数据子集为OS的进行统计,jitter.x=TRUE作用是当多个观察值在同一个月份具有相同值的时候对水平方向增加少许的随机变化
多面板直方图:histogram
histogram(~ SAL|Station,data=Env,
subset=(Area == "OS"),layout=c(1,4),
nint=30,xlab="Salinity",ylab="Frequencies",
strip=FALSE,strip.left=TRUE) #需统计的变量是SAL, subset确定数据子集,layout=c(1,4)设定图为一列四行的排列顺序,nint=30设定条形的数目是30,strip=FALSE,strip.left=TRUE将带状移到面板的侧边
面板函数
xyplot(SAL~Month|Year,data=Env,
type=c("p"),subset=(Station=="GROO"),
xlim=c(0,12),ylim=c(0,30),pch=19,
panel=function(...){
panel.xyplot(...)
panel.grid(...,h=-1,v=-1)
panel.loess(...)
})
参数panel的作用是联系具体的面板函数和绘图规则,如果交换panel.xyplot和panel.grid的顺序,先绘制的将是网格,面板函数panel.loess使得图中增加了一条光滑的线,线的光滑程度介于0-1之间,可通过属性span确定
type也可以完成以上操作,type的三个值"p",“g”,“smooth”,作用相当于xyplot函数执行了panel.xyplot,panel.grid,panel.smooth三个面板函数
dotplot(factor(Month)~SAL|Station,pch=16,
subset=(Area=="OS"),data=Env,
ylab="Month",xlab="Salinity",
panel=function(x,y,...){
Q<- quantile(x,c(0.25,0.5,0.75),na.rm=TRUE)
R<- Q[3]-Q[1]
L<- Q[2]-3*(Q[3]-Q[1])
MyCex <- rep(0.4,length(y))
MyCol<- rep(1,length(y))
MyCex[x<L]<-1.5
MyCol[x<L]<-2
panel.dotplot(x,y,cex=MyCex,col=MyCol,...)
}) # quantile用于计算分位数,R<- Q[3]-Q[1]表示第三分位数减第一分位数,L<- Q[2]-3*(Q[3]-Q[1])表示中位数减去第三分位数和第一分位数的三倍,若是小于该值则属于异常值,用其他颜色和大小绘图
巧妙之处: MyCex <- rep(0.4,length(y))
MyCol<- rep(1,length(y))
MyCex[x<L]<-1.5
MyCol[x<L]<-2
panel.dotplot(x,y,cex=MyCex,col=MyCol,…)
setwd("E:/R/R-beginer-guide/data/RBook")
Sparrows <- read.table(file="Sparrows.txt",header=TRUE)
xyplot(Wingcrd~Tarsus|Species*Sex,
xlab="Axis 1",ylab="Axis 2",data=Sparrows,
xlim=c(-1.1,1.1),ylim=c(-1.1,1.1),
panel=function(subscripts,...){
zi <- Sparrows[subscripts,3:8]
di <- princomp(zi,cor=TRUE)
Load <- di$loadings[,1:2]
Scor <- di$scores[,1:2]
panel.abline(a=0,b=0,lty=0,col=1)
panel.abline(h=0,v=0,lty=2,col=1)
for(i in 1:6){
llines(c(0,Load[i,1]),c(0,Load[i,2]),col=1,lwd=2)
ltext(Load[i,1],Load[i,2],rownames(Load)[i],cex=0.7)
}
sc.max<-max(abs(Scor))
Scor <- Scor/sc.max
panel.points(Scor[,1],Scor[,2],pch=1,cex=0.5,col=1)
}) #两个条件变量,Species*Sex,由于原本是字符型因此直接当因子处理,向量subscripts自动包含了面板函数中所选数据的行数即3:8,Load和Scor是提前前两个轴的权重和得分,abline是绘制通过原点的轴,Scor/sc.max将得分调整至-1到1之间,并用panel.points函数将其绘制成点
PCA的结果可以被缩放到使其数值信息(坐标)在图中的取值介于-1到1之间,princomp的作用是进行主成分分析
三维散点图、表面图和等高线图
library(lattice)
cloud(CHLFa~T*SAL|Station,data=Env,
screen=list(z=105,x=-70)
ylab="Sal.",xlab="T",zlab="Chl.a",
ylim=c(26,33),subset=(Area=="OS"),
scales=list(arrows=FALSE)) #screen指出坐标轴的旋转度数,arrows=FALSE表示移除用于指示坐标轴正方向的箭头,这样坐标轴就有刻度
函数levelplot,countourplot和wireframe可以用来绘制表面图
改变面板顺序
Birds<-as.vector(as.matrix(Hawaii[,2:9])) #as.vector只能将矩阵变向量,因此先将数据框变矩阵
Time<-rep(Hawaii$Year,8)
MyNames<-c("Stilt_Oahu",...."Moorhen_Kauai")
ID<-rep(MyNames,each=48) #生成ID序列,每个名字重复48次
xyplot(Birds~Time|ID,ylab="Bird abundance",layout=c(3,3),type="l",col=1)
ID2<-factor(ID,levels=c("Stilt_Oahu",...."Moorhen_Kauai")) #改变面板顺序,只需改变因子ID的levels顺序即可
改变坐标轴界限和刻度
xyplot(Birds~Time|ID,ylab="Bird abundance",
layout=c(3,3),type="l",col=1,
scales=list(x=list(relation="same"),
y=list(relation="free"),
tck=-1)) #x轴具有相同范围,y轴根据数据范围确定,tck改变刻度线方向
在一个面板中绘制多条线
xyplot(Birds~Time|ID,ylab="Bird abundance",
layout=c(3,3),type="l",col=1,
scales=list(x=list(relation="same"),
y=list(relation="free"),
groups=ID,lwd=c(1,2,3)) #groups函数可以使同一种鸟绘制于一个单独面板中
在循环中绘图
AllAreas<-levels(unique(Env$Area)) #确定Area的值
for(i in AllAreas){
Env.i<-Env[Env$Areas==i,]
win.graph()
dotplot(factor(Month)~SAL|Station,data=Env.i)
print(dotplot(factor(Month)~SAL|Station,data=Env.i))
} #循环Area的值,Env.i<-Env[Env$Areas==i,]表示不同地区的数据的值都根据该地区进行变化,要得到图像必须将print放在循环里面
更新图形
Myplot<-xyplot(SAL~MyTIme|Station,type="l",data=Env)#将图像存储到一个对象中
print(Myplot)
updata(MyPlot,layout=c(10,3)) #以一个新的排列方式来绘制图形
当我们使用updata命令来处理图形的时候,我们的原始图形是不会改变的
总结
|
请发表评论