// gm.asy - Un fourre-tout de fonctions (récentes ou anciennes) pour Asymptote. // // Dernière modification : 04/07/15 pour l'ajout d'une ancienne fonction cote3D(...) // proposée sur le forum le 10/04/10. import stats; import geometry; import graph; import three; /////////////////////////////////////////////////////////// ////////// STATISTIQUES /////////////////////////////////////////////////////////// // // Remarque de février 2012 : ce qui suit est amené à disparaitre // Une extension gm_stats devrait voir le jour avant la fin 2012. // Tout sera réécrit depuis une feuille blanche... // ... mais si cela peut dépanner jusque là. // // Rappel de la histogramm défini dans stats.asy : // void histogram(picture pic=currentpicture, real[] bins, real[] count, // real low=-infinity, // pen fillpen=nullpen, pen drawpen=nullpen, bool bars=false, // Label legend="", real markersize=legendmarkersize) // Une version perso (avec un e à la fin), plus adaptée pour faire // des histogrammes pour un de math de lycée : void histogramme(picture pic=currentpicture, real[] tabxi, // les xi définissants les classes real[] tabni, // les effectifs (ou fréquence) par classe. bool bars=true, pen p1=lightgray, pen p2=.8bp+blue, string libellecaractere="Valeurs du caract\`ere", real minaxe=min(tabxi), real maxaxe=max(tabxi), real uniteaxe=(maxaxe-minaxe)/4, string libelleunite="", bool afficherUniteAire=true, bool valeurUniteAire=true, bool frequence=false, bool pourcent=false, real uniteaire=sum(tabni)/100){ real uniteairetempo; if(frequence==false) uniteairetempo=uniteaire; if(frequence==true && pourcent==false) { if(uniteaire>=1) uniteaire=uniteaire/100; uniteairetempo=uniteaire*sum(tabni); } if(frequence==true && pourcent==true) { uniteairetempo=uniteaire*sum(tabni)/100; } // Une variable utile pour déterminer la plus petite amplitude : real largeurunite=abs(tabxi[1]-tabxi[0]); // ... et une autre pour le numéro de classe correspondant : int iclasse=0; // Calcul des hauteurs (et de la plus petite amplitude de classe) : real[] tabhi; for(int i=0; i < tabni.length; ++i){ tabhi[i]=tabni[i]/(tabxi[i+1]-tabxi[i]); if (largeurunite>abs(tabxi[i+1]-tabxi[i])) { largeurunite=abs(tabxi[i+1]-tabxi[i]); iclasse=i; } } // Hauteur du rectangle le plus haut pour placer l'unité au dessus. real hauteurmaxi=max(tabhi); // Calcul de la hauteur à donner au rectangle unité d'aire real hauteurunite=(uniteairetempo/tabni[iclasse])*tabhi[iclasse]; int nbrlignes = ceil(hauteurmaxi/hauteurunite); for(int k=0; k<=nbrlignes; ++k){ draw((minaxe,k*hauteurunite)--(maxaxe,k*hauteurunite),.5bp+gray); } for(int k=0; k<=((maxaxe-minaxe)/largeurunite); ++k){ draw((minaxe+k*largeurunite,0)--(minaxe+k*largeurunite,nbrlignes*hauteurunite),.5bp+gray); } // Tracé de l'histogramme histogram(tabxi,tabhi,low=0,bars=bars,p1,p2); // Tracé de l'unité d'aire et son étiquette if(afficherUniteAire){ filldraw(shift(truepoint(N+W))*box((0,0),(largeurunite,hauteurunite)),p1,p2); if(valeurUniteAire) label(libelleunite+(string) uniteaire+(pourcent==true ? "\%": ""),truepoint(N+W)+(largeurunite,-hauteurunite/2),E); } // Ajout de l'axe gradué xaxis(libellecaractere, Bottom, minaxe,maxaxe, RightTicks(Label(currentpen+fontsize(6)), Step=uniteaxe),above=true); } /////// bam et multibam pour des diagrammes en boite. void bam(real[] xi, real h=1, real dh=0, bool lab=true, real Step=1){ xi=sort(xi); real n=xi.length; real xmin=min(xi), q1= (floor(.25*n)==.25*n) ? xi[floor(.25*n)-1] : xi[floor(.25*n)], me= (n%2==0) ? (xi[floor(n/2)-1]+xi[floor(n/2)])/2 : xi[floor((n+1)/2)-1], q3= (floor(.75*n)==.75*n) ? xi[floor(.75*n)-1] : xi[floor(.75*n)], xmax=max(xi); xaxis(xmin,xmax,Ticks(Step=Step,Size=2)); draw(box((q1,1+dh),(q3,1+dh+h))); draw((me,1+dh)--(me,1+dh+h)); real hm=(1+dh+1+dh+h)/2; draw((xmin,hm)--(q1,hm)^^(q3,hm)--(xmax,hm)); draw((xmin,hm-.1)--(xmin,hm+.1)^^(xmax,hm-.1)--(xmax,hm+.1)); draw((xmin,0)--(xmin,hm)^^(q1,0)--(q1,hm)^^(me,0)--(me,hm)^^(q3,0)--(q3,hm) ^^(xmax,0)--(xmax,hm),linetype("4 4")); if(lab){ label("$X_{min}$",(xmin,hm),S,UnFill()); label("$Q_1$",(q1,hm-h/2),S,UnFill()); label("$M$",(me,hm-h/2),S,UnFill()); label("$Q_3$",(q3,hm-h/2),S,UnFill()); label("$X_{max}$",(xmax,hm),S,UnFill()); } } picture bam0(real[] xi, real larg=1, bool comment_b=false, bool titre_b =false, Label titre_l ="", pair titre_pos=max(xi), align titre_dir=NoAlign, pen stylo=currentpen, pen backgr=nullpen ){ picture pic; xi=sort(xi); real n=xi.length; real xmin=min(xi), q1= (floor(.25*n)==.25*n) ? xi[floor(.25*n)-1] : xi[floor(.25*n)], me= (n%2==0) ? (xi[floor(n/2)-1]+xi[floor(n/2)])/2 : xi[floor((n+1)/2)-1], q3= (floor(.75*n)==.75*n) ? xi[floor(.75*n)-1] : xi[floor(.75*n)], xmax=max(xi); filldraw(pic,box((q1,-larg/2),(q3,larg/2)),backgr,stylo); draw(pic,(me,-larg/2)--(me,larg/2),stylo); draw(pic,(xmin,0)--(q1,0)^^(q3,0)--(xmax,0),stylo); draw(pic,(xmin,-.1)--(xmin,.1)^^(xmax,-.1)--(xmax,.1),stylo); if(titre_b) label(pic,titre_l,titre_pos,titre_dir); if(comment_b){ label(pic,"$X_{min}$",(xmin,0),S,UnFill()); label(pic,"$Q_1$",(q1,-larg/2),S,UnFill()); label(pic,"$M$",(me,-larg/2),S,UnFill()); label(pic,"$Q_3$",(q3,-larg/2),S,UnFill()); label(pic,"$X_{max}$",(xmax,0),S,UnFill()); } return pic; } void multibam(picture pic=currentpicture, real[][] ij, real[] larg =new real[], real[] esp =new real[], bool tit_b =false, Label[] tit =new Label[], align[] tit_d =new align[], pen[] sty =new pen[], pen[] bkg =new pen[], real Step=0, real step=0, real xmargin=0, bool vertical=false, bool twoaxis=false){ picture pict; int n=ij.length; if(larg.length==0)larg.push(1); if(esp.length==0) esp.push(.5); while(larg.lengthabs(vAB.y))? ((abs(vAB.y)>abs(vAB.z))?Z:Y) : ((abs(vAB.x)>abs(vAB.z))?Z:X); transform3 Tp=shift(offset*v); pic.add(new void(picture f, transform3 t) { picture opic; path3 G=Tp*t*g; Label L=L.copy(); draw(opic,L,G,p,arrow); triple Ap=t*A, Bp=t*B; draw(opic,(Ap--Tp*Ap)^^(Bp--Tp*Bp), joinpen); add(f,opic); }, true); }