BFCase的列是时间,行是各个国家
Cases <- rowSums(BFCases[,2:16]) #对每一行的2到16列进行累加
names(Cases) <- BFCases[,1] #names 给Cases加上BFCase的第一列标签
Cases
2003 2004 2005 2006 2007 2008
4 46 98 115 88 34
par函数
par(mfrow=c(2,2),mar=c(3,3,2,1))
mfrow=c(2,2) 生成4个图,每一列上2个,每一行上2个
mar选项指定每个图形周围的空白大小,缺省则是c(5,4,4,2)+0.1
饼图:
pie(Cases,main="Ordinary pie chart") #普通饼图
pie(Cases,col=gray(seq(0.4,1.0,length=6)),clockwise=TRUE,main="Gray colours") #clockwise=TRUE因此翻转方向类似于时钟方向,gray则是灰色
pie(Cases,col=rainbow(6),clockwise=TRUE,main="Rainbow colours") #rainbow则是彩虹色
library(plotrix)
pie3D(Cases,labels=names(Cases),explode=0.1,main="3D pie chart",labelcex=0.6) #3D饼图
计算死亡数量:
BFDeaths <- read.table(file="BirdFluDeaths.txt",header=TRUE)
Deaths <- rowSums(BFDeaths[,2:16])
names(Deaths) <- BFDeaths[,1]
条形图和带形图:
par(mfrow = c(2,2),mar = c(3,3,2,1))
barplot(Cases,main="Bird Flu cases") #条形图画出流感数量
Counts <- cbind(Cases,Deaths) #将流感数量和死亡数量合成一个矩阵
barplot(Counts) #画出该矩阵
barplot(t(Counts),col = gray(c(0.5,1))) #将矩阵转置后再绘图,t(Counts)
barplot(t(Counts),beside = TRUE) #beside=TRUE,即可画出两个并行的条形
显示均值和标准差的条形图
Benthic <- read.table(file="RIKZ2.txt",header = TRUE)
Bent.M <- tapply(Benthic$Richness,INDEX=Benthic$Beach,FUN=mean)
Bent.sd <- tapply(Benthic$Richness,INDEX=Benthic$Beach,FUN=sd)
MSD <- cbind(Bent.M,Bent.sd)
MSD
tapply
根据x的不同水平对y使用FUN的函数
tapply(y,x,FUN=mean)
bp <- barplot(Bent.M,xlab="Beach",ylim=c(0,20),ylab="Richness",col=rainbow(9))
arrows(bp,Bent.M,bp,Bent.M+Bent.sd,lwd=1.5,angle=90,length=0.1)
box()
表示标准差的垂直线通过函数arrows被加到图形上
arrows函数在坐标为(x1,y)和(x2,y)的两点间画一个箭头,因为具有同一个x,因此会产生一个垂直箭头
y1的值是均值Bent.M,y2的值是均值加上标准差Bent.M+Bent
带形图
Benth.le <- tapply(Benthic$Richness,INDEX=Benthic$Beach,FUN=length)
Benth.se <- Bent.sd / sqrt(Benth.le) #标准误
stripchart(Benthic$Richness ~ Benthic$Beach,vert = TRUE,pch=1,method="jitter",
jit=0.05,xlab="Beach",ylab="Richness")
points(1:9,Bent.M,pch=16,cex=1.5) #均值用实心圆点表示
arrows(1:9,Bent.M,1:9,Bent.M+Benth.se,lwd = 1.5,angle = 90,length = 0.1) #均值加上标准误
arrows(1:9,Bent.M,1:9,Bent.M-Benth.se,lwd = 1.5,angle = 90,length = 0.1) #均值减去标准误
(结果见上图右边)
盒形图
Owls <- read.table("Owls.txt",header = TRUE)
boxplot(Owls$NegPerChick,main="Negotiation per chick")
par(mfrow = c(2,2),mar = c(3,3,2,1))
boxplot(NegPerChick ~ SexParent,data = Owls)
boxplot(NegPerChick ~ FoodTreatment,data = Owls)
boxplot(NegPerChick ~ SexParent * FoodTreatment,data = Owls)
boxplot(NegPerChick ~ SexParent * FoodTreatment,names = c("F/Dep","M/Dep","F/Sat","M/Sat"),data = Owls)
par(mar = c(2,2,3,3)) #设置空白边框
boxplot(NegPerChick ~ Nest,data = Owls,axes = FALSE,ylim =c (-3,8.5)) #ylim指定垂直轴的上下限,下限为负数则可以允许我们将标签放在图形的下部
axis(2,at = c(0,2,4,6,8)) #axis函数用于画一个轴,2作为第一个参数,at参数具体指定刻度记号在哪里
text(x=1:27,y = -2,labels=levels(Owls$Nest),cex=0.75,srt = 65) #text命令将所有标签放置在合适的坐标处,cex参数指定字体的大小并且str定义角度
Bentic.n<-tapply(Benthic$Richness,Benthic$Beach,FUN=length) #计算海滩的观测值数量
BP.info<-boxplot(Richness~Beach,data=Benthic,col="grey",xlab="Beach",ylab="Richness") #用boxplot函数计算并存储在一个列表里
BP.midp<-BP.info$stats[2,]+(BP.info$stats[4,]-BP.info$stats[2,])/2 #计算所有海滩的中点
text(1:9,BP.midp,Bentic.n,col="white",font=2) #将bentic.n的值放在盒子里
克里兰夫点图
Deer <- read.table(file="Deer.txt",header = TRUE,fill = TRUE)
dotchart(Deer$LCT,xlab="Length (cm)",ylab=" Observation number")
Isna <- is.na(Deer$Sex) #生成一个和Sex具有相同长度的向量,它的值是T或F
dotchart(Deer$LCT[!Isna],groups=factor(Deer$Sex[!Isna]),xlab="Length(cm)",
ylab="Observation number grouped by sex) #groups选项允许数据根据变量分组,变量Sex有缺失值,[!Isna],!符号把它的值做过颠倒因此只有Sex的值不缺失的被绘制出
groups选项允许数据根据变量分组
符号!把它的值做过颠倒因此只有Sex的值不缺失的被绘制出
添加均值的克里兰夫点图
Benthic <- read.table(file="RIKZ2.txt",header = TRUE)
Benthic$fBeach <- factor(Benthic$Beach) #groups选项后要跟因子变量
par(mfrow = c(1,2))
dotchart(Benthic$Richness,groups = Benthic$fBeach,xlab = "Richness",ylab="Beach") #根据beach变量进行分组绘图
Bent.M <- tapply(Benthic$Richness,Benthic$Beach,FUN=mean) #计算均值
dotchart(Benthic$Richness,groups = Benthic$fBeach,gdata=Bent.M,
pch=19,xlab="Richness", ylab="Beach") #gdata属性用来覆盖一个统计量,在点图上添加均值,均值设为黑色实心圆点
legend("bottomright",c("values","mean"),pch=c(1,19),bg="white")
polt函数
plot(y = Benthic$Richness,x = Benthic$NAP,xlab="Mean high tide (m)",
ylab="Species richness",main="Benthic data")
M0 <- lm(Richness ~ NAP ,data = Benthic) #lm表示使用线性回归建立模型,结果存储在MO列表内
abline(M0) #abline函数添加拟合线
plot(y = Benthic$Richness,x = Benthic$NAP, type="n",axes=FALSE ,
xlab="Mean high tide (m)",ylab="Species richness") #axes=FALSE 取消坐标轴,type="n" 生成没有点的图形,即生成一个空白的仅有标签的窗口开始
points(y = Benthic$Richness,x = Benthic$NAP) #在仅有标签的空白窗口用points函数添加点
注意在points函数前要先执行plot函数
plot(y = Benthic$Richness,x = Benthic$NAP, type="n",axes=FALSE ,
xlab="Mean high tide (m)",ylab="Species richness",
xlim = c(-1.75,2),ylim = c(0,20)) #xlim,ylim 指定水平轴,垂直轴的范围
points(y = Benthic$Richness,x = Benthic$NAP)
axis(2,at = c(0,10,20),tcl = 1) #2表示画垂直轴,at表示在哪刻轴的刻度,tcl缺失值为0.5,表示插入长度
axis(1,at = c(-1.75,0,2),labels=c("Sea","Water line","Dunes")) #1表示画水平轴,labels则是表示在-1.75,0,2处添加特征字符
**points 在一个图形上添加新值
type 设置为p绘制点,l是线,o是链接并覆盖点的线,b是点和线,s和S是阶梯线,h是垂直线,n是没有点和线
text 使用x和y的坐标从而指定包含标签字符串的标签向量在图形的指定位置
pos 表示位置在指定坐标点下左上右(1,2,3,4)方
offset使标签偏移指定坐标的量与一个字符宽度成一定的比例
type=“n”,axes=F,xlab="",ylab="",那么就会什么都不显示,再用以下命令自定义绘图:
图例
Birds <- read.table(file="loyn.txt",header =TRUE)
Birds$LOGAREA <- log10(Birds$AREA) #进行对数变化
plot(x=Birds$LOGAREA,y=Birds$ABUND,xlab="Log transformed area",
ylab="Bird adbundance") #绘制出需要进行拟合的点
M0 <- lm(ABUND~LOGAREA+GRAZE,data=Birds) #进行线性回归
summary(M0) #将线性回归的结果输出
LAR <- seq(from=-1,to =3,by =1) #序列函数,选择几个在观察数据范围内之间的任意值
ABUND1 <- 15.7+7.2*LAR #通过简单微积分决定每个放牧水平的丰富度的值
ABUND2 <- 16.1+7.2*LAR
ABUND3 <- 15.5+7.2*LAR
ABUND4 <- 14.1+7.2*LAR
ABUND5 <- 3.8+7.2*LAR
lines(LAR,ABUND1,lty = 1,lwd=1,col=1) #将计算结果拟合画出,用lines前需要用order先排序
lines(LAR,ABUND2,lty = 2,lwd=2,col=2)
lines(LAR,ABUND3,lty = 3,lwd=3,col=3)
lines(LAR,ABUND4,lty = 4,lwd=4,col=4)
lines(LAR,ABUND5,lty = 5,lwd=5,col=5)
legend.txt <- c("Graze 1","Graze 2","Graze 3","Graze 4","Graze 5") #定义作为图例的文本
legend("topleft",legend=legend.txt,
col=c(1,2,3,4,5),
lty=c(1,2,3,4,5),
lwd=c(1,2,3,4,5),
bty="o",cex=0.8) #"topleft"表示图例位置为左上角,col指定颜色,lty指定线的形状,lwd指定线的宽度,bty表示添加围绕图例的盒子,cex指定图例中文本的大小
函数identify用来识别和绘制图形上的点,它可以通过给定图形上x,y的坐标完成或简单地输入图形目标,同时可以使用该函数得到某个点的样本数,但只对plot函数生成的图像起作用
属性pointsize可以改变字体大小,font可以定义字型
Whales <- read.table(file="TeethNitrogen.txt",
header=TRUE)
N.Moby <- Whales$X15N[Whales$Tooth=="Moby"] #Moby这头鲸的氮同位素比例
Age.Moby <- Whales$Age[Whales$Tooth=="Moby"] #Moby这头鲸的年龄
plot(x=Age.Moby,y=N.Moby,xlab="Age",ylab=expression(paste(delta^{15},"N"))) #expression函数用于添加特殊符号,paste命令使得delta^{15},"N"相结合,并用expression函数插入
其他有用的函数
pairs函数可以绘制多组图
协同图
coplot(Richness ~ NAP | as.factor(Beach),pch=19,data=Benthic) #和plot函数反过来,第一个参数是y,第二是x,beach函数作为因子,进行分组
coplot(Richness ~ NAP | grainsize,pch=19,data=Benthic) #使用grainsize作为条件变量作协同图,该条件变量为连续条件变量
panel.lm=function(x,y,...) #自定义函数panel.lm,lm线性回归,该回归忽略缺失值na.action = na.omit,并储存在变量tmp中,用abline绘制线,points绘制点
{
tmp <- lm(y ~ x,na.action = na.omit)
abline(tmp)
points(x,y,...)
}
coplot(Richness ~ NAP |as.factor(Beach),
pch=19,panel=panel.lm,data = Benthic) #panel函数在每个面板上显示函数的执行结果
NAP的关系随着粒径梯度改变,NAP和粒径之间存在交互作用,因此可能包含交互作用项
pHEire <- read.table(file="SDI2003.txt",header = TRUE)
pHEire$LOGAlt <- log10(pHEire$Altitude) #对数变换
pHEire$fForested <- factor(pHEire$Forested) #设为因子,计算时以fForested分组
coplot(pH ~ SDI | LOGAlt * fForested,
panel=panel.lm,data=pHEire,number=2) #LOGAit区间的数目和位置可以通过参数number控制,若没有设定number则有过多的面板造成协同图过于稠密
pHEire$Temp2 <- cut(pHEire$Temperature,breaks=2) #用cut函数将数据分为两部分,breaks=2,因此平均值以上是一种,平均值以下是一种
pHEire$Temp2.num <- as.numeric(pHEire$Temp2) #因为Temp2是因子,因此转换为数值型,Temp2.num是一个具有值为1和2的向量
coplot(pH ~ SDI | LOGAlt*fForested,
panel=panel.lm,data = pHEire,
number = 3,cex=1.5,pch=19,
col = gray(pHEire$Temp2.num/3)) #gray(1/3)是深灰色,gray(2/3)是浅灰色
组合不同类型的图
MyLayOut <- matrix(c(2,0,1,3),nrow=2,ncol=2,byrow=TRUE) #设定矩阵,规定三幅图分别放在哪里,第二幅放第一行第一列,第一幅放第二行第一列,第三幅放第二行第二列
MyLayOut
nf <- layout(mat = MyLayOut,widths = c(3,1),
heights = c(1,3),respect = TRUE) #设定矩阵的列宽和行高,第一列宽为3,第二列宽为1,第一行高为1,第二行高为3
show(nf) #验证是否符合设定
xrange <- c(min(Benthic$NAP),max(Benthic$NAP)) #规定x的范围
yrange <- c(min(Benthic$Richness),max(Benthic$Richness)) #规定y的范围
#First graph
par(mar = c(4,4,2,2)) #避免图形周围空白过多,多试验mar调整空白
plot(Benthic$NAP,Benthic$Richness ,
frame.plot = FALSE,xlim = xrange,ylim = yrange,ylab = "Richness") #画出散点图
#Second graph
par(mar = c(0,3,1,1))
boxplot(Benthic$NAP,horizontal=TRUE,axes = FALSE,
frame.plot = FALSE,ylim= xrange,space = 0) #画出NAP盒形图
#Third graph
par(mar=c(3,0,1,1))
boxplot(Benthic$Richness,axes = FALSE,ylim = yrange,space = 0,horiz= TRUE) #画出Richness盒形图
总结