############################ ## Bezier curves # a = x-axes coordinates # o = y-axes coordinates bezier=function(a,o,by=0.01){ t=seq(0,1,by=by) d=length(a) if (d==1){ return(matrix(rep(c(a,o),length(t)),ncol=2,byrow=T)) } else{ g=bezier(a[2:d],o[2:d],by) h=bezier(a[1:(d-1)],o[1:(d-1)],by) return(rbind(sapply(c(1,2), function(l){ sapply(1:length(t), function(i){ t[i]*g[i,l]+(1-t[i])*h[i,l] } ) } ) ) ) } } bezierm=function(m,by=0.01){ bezier(m[1,],m[2,],by) } ####################################################### #### drawing partitions ## lnum: lengths of the drawn partitions ## llab: written lengths of the drawn partitions ## lmod: nbs of the segments that are drawn desspart=function(nfpart,lnum,llab=NULL,xaxt="l",lmod=NULL){ lp=scan(nfpart, what="character", sep="\n",strip.white=TRUE,quiet=TRUE) llp=lp[lnum] ############## values llp2=sub("::",":0:",llp) llv1=strsplit(llp2,"(<[[:digit:]]+-[[:digit:]]+>[[:digit:]]+:|:| XXX | ---> -?[[:digit:]]+\\.?[[:digit:]]+)") llv=lapply(llv1,function(l){ a=(l!="") return(as.numeric(l[a[1:(length(a)-1)]])) } ) ############## descriptors lll=strsplit(llp,"(<[[:digit:]]+-[[:digit:]]+>|:-?[[:digit:]]+\\.?[[:digit:]]+:| XXX |::)") lld=lapply(lll,function(l){ a=(l!="") return(as.numeric(l[a[1:(length(a)-1)]])) } ) if (length(lmod)==0) { lmod=unique(unlist(lld)) } ########## segments a=strsplit(llp,"(XXX|:|>)") llim=lapply(a,function(b){sapply(strsplit(b[grep("<",b)],"[<-]"), function(x){as.numeric(x[c(2,3)])})}) llim=llim[sapply(llim,length)>0] ##### curves llim2=lapply(1:length(llim), function(i){ lim=llim[[i]][,which(lld[[i]]%in%lmod),drop=F] lv=llv[[i]][which(lld[[i]]%in%lmod)] if (length(lv)!=0){ M=max(lv) m=min(lv) if (M-m != 0){ lvn=0.8*lv/(max(M,0)-min(m,0)) M=max(lvn) m=min(lvn) if (M<0) { dep=0.95 dec=0.9 } else if (m>0) { dep=0.05 dec=0.1 } else { dep=0.1-m dec=0.1-m } } else { lvn=lv if (M>=0){ dep=0.1 dec=0.9-M } else { dep=0.9 dec=0.1-M } } lcb=lapply(1:length(lvn),function(j){ l=lim[,j] m=lvn[j] ec=min(diff(l)/10,100) ab=rbind(c(0,0,diff(l)/10*c(1,2,-2,-1),0,0)+rep(l,each=4), c(i+dep,rep(dec+m+i,6),i+dep)) cm=rbind(bezierm(ab[,1:4]),t(ab[,4:5]),bezierm(ab[,5:8])) return(t(cm)) } ) return(lcb) } } ) plot(c(0,max(llim[[1]])),c(1,length(llim)+1),t="n",axes=FALSE, xlab="", ylab="") lapply(llim2, function(ll){ lapply(ll,function(l){ lines(t(l)) } ) } ) ### axes posl=(1:length(llim))+0.5 r=sapply(llim,dim)[2,] if (length(llab)!=0) { ir=which(r%in%llab) posl=posl[ir] r=r[ir] } if (length(posl)>1){ axis(2, at=posl, labels=r,tick=F) } if (length(posl)==1) { axis(2) } al=as.vector(llim[[1]]) lgdon=al[length(al)] if (xaxt!="n"){ axis(1) axis(1, at=c(0,lgdon), labels=c(0,lgdon)) } }