这是我第一次在CSDN上发表博客,以记录自学R语言的一点一滴。
关于作图
晚上有一位朋友让我拜托做一幅图,大致是关于土壤深度与PH以及碱化度的函数关系,给的是几组数据,做出折线图。从文献上看如下图所示。
P.S. 由于未给数据,以下所有数据都是自己编的,完全无实用价值。并且博主本人也不是学习土壤这方面的专业,有些简单的问题可能略可笑,不喜勿喷。
自己第一次自学R语言,也是边翻书边解决。一开始以为是简单的在一副折线图上再画上另外一条直线即可,于是用了函数lines(),代码如下:
rm(list=ls(all=TRUE))
x<-c(5,10,15,20,25,30)
y<-c(9,9.5,10,9,9,8.5)
z<-c(8,8.5,9,8,8,8.5)
par(mar=c(5,4,4,8)+0.1)
plot(x,y,type="b",pch=19,col="black",yaxt="n",ann=FALSE,lty=1,cex=2.2,lwd=2,ylim=c(7,14))
lines(x,z,type="b",pch=1,col="black",lty=1,cex=2.2,lwd=2,ylim=c(30,50))
axis(2,col.axis="black",las=2)
axis(4,col.axis="black",las=2)
mtext("ESP",side=4,line=3,cex.lab=1,las=0,col="black")
title("土壤剖面的PH和碱化度",xlab="深度",ylab="PH");
由于对ESP的知识不是特别了解并且没有注意文献中ESP的取值,看着文献中的图模拟画了一个类似的折线图,后面发给朋友看了以后朋友说ESP的范围在0到80,文献中大致是30到50,后面将ESP的数值进行修改后发现PH和ESP的数值相差太大,要求作图是PH这边取值范围是[7,14],ESP取值范围是[0,80],反应过来如果用lines()函数可能两条折线无法同时在一张图内显示出来,于是后面考虑par(new=T)函数,即在旧的折线图上继续作图,保留原来的折线,并且修改了ESP的取值(也是自己编的),代码如下:
rm(list=ls(all=TRUE))
x<-c(5,10,15,20,25,30)
y<-c(9,9.5,10,9,9,8.5)
z<-c(35,36,37,38,35,34)
par(mar=c(5,4,4,8)+0.1)
plot(x,y,type="b",pch=19,col="black",yaxt="n",ann=FALSE,lty=1,cex=2.2,lwd=2,ylim=c(7,14))
axis(2,col.axis="black",las=2,seq(7,14,1))
par(new=T)
plot(x,z,type="b",pch=1,col="black",lty=1,cex=2.2,lwd=2,yaxt="n",ylim=c(0,80),ann=FALSE)
axis(4,col.axis="black",las=2,seq(0,80,20))
mtext("ESP",side=4,line=3,cex.lab=1,las=0,col="black")
title("土壤剖面的PH和碱化度",xlab="深度",ylab="PH")
大家可以看到这就是改进之后的效果,和文献上的图大致就是扭转了90度的样子。
第二天,我朋友拿着图去问老师,老师希望能按文献上的样子做而不是扭转90度,后面才想明白,意思是把整个坐标轴看成是一块土壤,最上面是地表,往下挖观察土壤深度和ESP之间的直观关系。大致就是把坐标轴重新定义一下即可。这里遇到一个小麻烦,需要将Y轴的坐标从上倒下0增长到100,作为学数学出生的博主认为违反了坐标轴的概念,但转念一想其实就是坐标系旋转一下即可,也就是ylim=c(0,100),改成ylim=c(100,0)。
rm(list=ls(all=TRUE))
x<-c(5,10,15,20,25,30)
y<-c(7,8,9,12,11,14)
z<-c(10,20,40,50,75,80)
plot(y,x,type="b",pch=19,col="black",xaxt="n",yaxt="n",ann=FALSE,lty=1,cex=2.2,lwd=2,ylim=c(100,0),xlim=c(7,14))
axis(2,col.axis="black",las=2,seq(0,100,15))
axis(3,col.axis="black",las=0,seq(7,14,1))
par(new=T)
plot(z,x,type="b",pch=1,col="black",lty=1,cex=2.2,lwd=2,xlim=c(0,80),ylim=c(100,0),xaxt="n",yaxt="n",ann=FALSE)
axis(1,col.axis="black",las=0,seq(0,80,15))
mtext("PH",side=3,line=3,cex.lab=1,las=0,col="black")
title(xlab="ESP",ylab="深度")
基本上和文献中的图类似了。
感谢你那么漂亮或者那么帅气能来看我的博客~