Page 1 sur 1
Diagramme circulaire
Posté : lun. 22 mars 2010, 14:05
par GM
Il faudra probablement un jour penser à créer une extension dédiée aux diagrammes statistiques mais en attendant, voilà un exemple de diagramme circulaire.
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
size(250,0);
// Tableau des modalités
string[] tabmod={"Modalit\'e 1","Modalit\'e 2","Modalit\'e 3",
"Modalit\'e 4","Modalit\'e 5"};
// Tableau des effectifs (ou fréquences)
real[] tabeff={20,6,7,10,11};
// Tableau des décalages éventuels des secteurs
real[] tabdecsec={0,.1,0,.2,0};
// Tableau des décalages éventuels des labels
real[] tabdeclab={0,.5,.5,.2,.2};
// Les deux couleurs utilisées pour composer
// les couleurs des secteurs
pen color1=green,color2=blue;
// Le stylo pour les labels
pen p3=blue,p4=yellow+white;
///////////////////////////////////////////////////////////////
/// Ce qui suit n'est a priori pas à changer et pourrait être
/// ajouté un de ces jours à une extension perso stats_gm.asy
/// pour être remplacé par :
/// diacirculaire(tabmod,tabeff,tabdec,color1,color2);
///////////////////////////////////////////////////////////////
real[] tabangle,tabanglecumule,tabanglelabel;
tabanglecumule[0]=0;
int n=tabeff.length;
for(int i=0; i<n; ++i) {
tabangle[i]=tabeff[i]*360/sum(tabeff);
tabanglecumule[i+1]=tabanglecumule[i]+tabangle[i];
tabanglelabel[i]=tabanglecumule[i]+tabangle[i]/2;
path secteur=(0,0)--arc((0,0),1,tabanglecumule[i],tabanglecumule[i+1])--cycle;
transform t1=shift(tabdecsec[i]*dir(tabanglelabel[i])),
t2=shift((.5+tabdecsec[i]+tabdeclab[i])*dir(tabanglelabel[i]));
filldraw(t1*secteur,i/n*color1+(1-i/n)*color2+white);
label(tabmod[i],t2*(0,0),p3,Fill(p4));
}
Re: Diagramme circulaire
Posté : lun. 22 mars 2010, 14:08
par GM
Le même script que précédemment avec de très petites modifications :
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
size(250,0);
// Tableau des modalités
string[] tabmod={"Modalit\'e 1","Modalit\'e 2","Modalit\'e 3",
"Modalit\'e 4","Modalit\'e 5"};
// Tableau des effectifs (ou fréquences)
real[] tabeff={20,6,7,10,11};
// Tableau des décalages éventuels des secteurs
real[] tabdecsec={0,0,.1,.5,0};
// Tableau des décalages éventuels des labels
real[] tabdeclab={0,.5,.5,.2,.5};
// Les deux couleurs utilisées pour composer
// les couleurs des secteurs
pen color1=green,color2=red;
// Le stylo pour les labels
pen p3=blue,p4=yellow+white;
///////////////////////////////////////////////////////////////
/// Ce qui suit n'est a priori pas à changer et pourrait être
/// ajouté un de ces jours à une extension perso stats_gm.asy
/// pour être remplacé par :
/// diacirculaire(tabmod,tabeff,tabdec,color1,color2);
///////////////////////////////////////////////////////////////
real[] tabangle,tabanglecumule,tabanglelabel;
tabanglecumule[0]=0;
int n=tabeff.length;
for(int i=0; i<n; ++i) {
tabangle[i]=tabeff[i]*360/sum(tabeff);
tabanglecumule[i+1]=tabanglecumule[i]+tabangle[i];
tabanglelabel[i]=tabanglecumule[i]+tabangle[i]/2;
path secteur=(0,0)--arc((0,0),1,tabanglecumule[i],tabanglecumule[i+1])--cycle;
transform t1=shift(tabdecsec[i]*dir(tabanglelabel[i])),
t2=shift((.5+tabdecsec[i]+tabdeclab[i])*dir(tabanglelabel[i]));
filldraw(t1*secteur,i/n*color1+(1-i/n)*color2+white);
label(tabmod[i],t2*(0,0),p3,Fill(p4));
}
Re: Diagramme circulaire
Posté : lun. 22 mars 2010, 14:14
par GM
Et encore des variantes :
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
size(250,0);
// Tableau des modalités
string[] tabmod={"Modalit\'e 1","Modalit\'e 2","Modalit\'e 3",
"Modalit\'e 4","Modalit\'e 5"};
// Tableau des effectifs (ou fréquences)
real[] tabeff={18,6,7,10,25};
// Tableau des décalages éventuels des secteurs
real[] tabdecsec={0,0,0,0,.4};
// Tableau des décalages éventuels des labels
real[] tabdeclab={0,.5,.5,.2,.5};
// Les deux couleurs utilisées pour composer
// les couleurs des secteurs
pen color1=blue,color2=orange;
// Le stylo pour les labels
pen p3=red,p4=white;
///////////////////////////////////////////////////////////////
/// Ce qui suit n'est a priori pas à changer et pourrait être
/// ajouté un de ces jours à une extension perso stats_gm.asy
/// pour être remplacé par :
/// diacirculaire(tabmod,tabeff,tabdec,color1,color2);
///////////////////////////////////////////////////////////////
real[] tabangle,tabanglecumule,tabanglelabel;
tabanglecumule[0]=0;
int n=tabeff.length;
for(int i=0; i<n; ++i) {
tabangle[i]=tabeff[i]*360/sum(tabeff);
tabanglecumule[i+1]=tabanglecumule[i]+tabangle[i];
tabanglelabel[i]=tabanglecumule[i]+tabangle[i]/2;
path secteur=(0,0)--arc((0,0),1,tabanglecumule[i],tabanglecumule[i+1])--cycle;
transform t1=shift(tabdecsec[i]*dir(tabanglelabel[i])),
t2=shift((.5+tabdecsec[i]+tabdeclab[i])*dir(tabanglelabel[i]));
filldraw(t1*secteur,i/n*color1+(1-i/n)*color2+white);
label(tabmod[i],t2*(0,0),p3,Fill(p4));
}
Re: Diagramme circulaire
Posté : lun. 8 oct. 2012, 14:18
par GM
Suite à une demande sur mathematex, une version 3D qui ne tient pas compte de ce qui précède (puisque je suis reparti d'une feuille blanche).
Il suffit de cela :
Code : Tout sélectionner
import mesmacrosdestats;
size(10cm);
currentlight=White;
currentprojection=orthographic(5,5,5);
real donnees[]={ 1, 2, 3, 4, 2};
pen couleur[]={red,blue,green,pink,yellow};
real decalage[]={ .4, 0, .25, 0, 0};
camembert3D(donnees,couleur,decalage);
... si dans
mesmacrosdestats.asy, on peut y trouver cela :
Code : Tout sélectionner
import three;
void camembert3D(real[] val, real r=5, real h=1, pen[] c, real[] d){
real total=sum(val),cumul=0;
for(int k=0; k<val.length; ++k){
path p=(0,0)--arc((0,0),r,cumul/total*360,(cumul+val[k])/total*360)--cycle;
p=shift(d[k]*r*dir((cumul+.5val[k])/total*360))*p;
draw(surface(path3(p)),c[k]);
draw(shift(0,0,h)*surface(path3(p)),c[k]);
draw(extrude(path3(p),h*Z),c[k]);
cumul+=val[k];
}
}