12 Nov 2007

## Official Asymptote example – diatom

 (Compiled with Asymptote version 2.14svn-r5318)
```/* This code comes from The Official Asymptote Gallery */

import graph;

size(15cm,12cm,IgnoreAspect);

real minpercent=20;
real ignorebelow=0;
string data="diatom.csv";
string[] group;
int[] begin,end;

defaultpen(fontsize(8pt)+overwrite(MoveQuiet));

file in=input(data).line().csv();

string depthlabel=in;
string yearlabel=in;
string[] taxa=in;
group=in;
begin=in;
real[] depth;
int[] year;
real[][] percentage;

while(true) {
real d=in;
if(eof(in)) break;
depth.push(d);
year.push(in);
percentage.push(in);
}

percentage=transpose(percentage);
real depthmin=-min(depth);
real depthmax=-max(depth);

int n=percentage.length;

int final;
for(int taxon=0; taxon < n; ++taxon) {
real[] P=percentage[taxon];
if(max(P) < ignorebelow) continue;
final=taxon;
}

real angle=45;
real L=3cm;
pair Ldir=L*dir(angle);
real ymax=-infinity;
real margin=labelmargin();

real location=0;

for(int i=0; i < begin.length-1; ++i) end[i]=begin[i+1]-1;
end[begin.length-1]=n-1;

typedef void drawfcn(frame f);
drawfcn[] draw=new drawfcn[begin.length];

pair z0;

for(int taxon=0; taxon < n; ++taxon) {
real[] P=percentage[taxon];
real maxP=max(P);
if(maxP < ignorebelow) continue;
picture pic;
real x=1;
if(maxP < minpercent) x=minpercent/maxP;
if(maxP > 100) x=50/maxP;
scale(pic,Linear(true,x),Linear(-1));
filldraw(pic,(0,depthmin)--graph(pic,P,depth)--(0,depthmax)--cycle,
gray(0.9));
xaxis(pic,Bottom,LeftTicks("\$%.3g\$",beginlabel=false,0,2),above=true);
xaxis(pic,Top,above=true);

frame label;
label(label,rotate(angle)*TeXify(taxa[taxon]),(0,0),N);

pair z=point(pic,N);
pair v=max(label);
int taxon=taxon;
pic.add(new void(frame f, transform t) {
pair z1=t*z+v;
ymax=max(ymax,z1.y+margin);
});

for(int i=0; i < begin.length; ++i) {
pair z=point(pic,N);
pair v=max(label);
if(taxon == begin[i]) {
pic.add(new void(frame f, transform t) {
pair Z=t*z+v;
z0=Z;
pair w0=Z+Ldir;
});
} else if(taxon == end[i]) {
int i=i;
pair align=2N;
pair z0=z0;
pair z1=t*z+v;
pair w1=z1+Ldir;
draw[i]=new void(frame f) {
path g=z0--(z0.x+(ymax-z0.y)/Tan(angle),ymax)--
(z1.x+(ymax-z1.y)/Tan(angle),ymax)--z1;
draw(f,g);
label(f,group[i],point(g,1.5),align);
};
});
}
}

if(taxon == 0) yaxis(pic,depthlabel,Left,RightTicks(0,10),above=true);
if(taxon == final) yaxis(pic,Right,LeftTicks("%",0,10),above=true);

location += pic.userMax().x;
}