<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

<article lang="en">
<articleinfo>
    <title>Conception de graphiques avec <inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/cran.jpg" contentwidth="40pt"/>
  </imageobject>
  <textobject><phrase>img/cran.jpg</phrase></textobject>
</inlinemediaobject></title>
    <date>Juillet 2007</date>
    <author>
        <firstname>Christophe</firstname>
        <surname>Lalanne</surname>
        <affiliation><address><email>christophe.lalanne@gmx.net</email></address></affiliation>
    </author>
    <authorinitials>CL</authorinitials>


</articleinfo>
<section>
<title>Introduction</title>
<simpara>Nous explorons dans ce document les possibilités graphiques de <emphasis role="strong">R</emphasis>,
à l'aide des fonctions graphiques standards et celles contenues dans
les packages <literal>lattice</literal>, <literal>grid</literal>, et <literal>ggplot</literal>.</simpara>

<simpara>Le lecteur intéressé trouvera d'autres illustrations, sans doute bien
meilleures que celles présentées ici, sur le web, notamment :</simpara>

<itemizedlist>
<listitem>
<simpara>
R Graphics (P. Murrell) :
  <ulink url="http://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html">http://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
R Graph Gallery : <ulink url="http://addictedtor.free.fr/graphiques/">http://addictedtor.free.fr/graphiques/</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
Statistiques avec R (V. Zoonekynd) :
  <ulink url="http://zoonek2.free.fr/UNIX/48_R_2004/all.html">http://zoonek2.free.fr/UNIX/48_R_2004/all.html</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
Treillis displays :
  <ulink url="http://netlib.bell-labs.com/cm/ms/departments/sia/project/trellis/">http://netlib.bell-labs.com/cm/ms/departments/sia/project/trellis/</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
Categorical data analysis with graphics :
  <ulink url="http://www.math.yorku.ca/SCS/Courses/grcat/">http://www.math.yorku.ca/SCS/Courses/grcat/</ulink>
</simpara>
</listitem>
</itemizedlist>
<simpara>ainsi qu'en consultant les documents disponibles sur le site officiel
de R, CRAN[http://cran.r-project.org/], en particulier :</simpara>

<itemizedlist>
<listitem>
<simpara>
R pour les débutants (E. Paradis) :
  <ulink url="http://cran.arsmachinandi.it/doc/contrib/Paradis-rdebuts_fr.pdf">http://cran.arsmachinandi.it/doc/contrib/Paradis-rdebuts_fr.pdf</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
S-PLUS (and R) Manual to Accompany Agresti's Categorical Data
  Analysis (L. Thompson) :
  <ulink url="https://home.comcast.net/~lthompson221/Splusdiscrete2.pdf">https://home.comcast.net/~lthompson221/Splusdiscrete2.pdf</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
Using R for Data Analysis and Graphics - Introduction, Examples and
  Commentary (J. Maindonald) :
  <ulink url="http://cran.arsmachinandi.it/doc/contrib/usingR-2.pdf">http://cran.arsmachinandi.it/doc/contrib/usingR-2.pdf</ulink>
</simpara>
</listitem>
<listitem>
<simpara>
Statistical Computing and Graphics Course Notes (F. Harrell) :
  <ulink url="http://cran.arsmachinandi.it/doc/contrib/Harrell-statcomp-notes.pdf">http://cran.arsmachinandi.it/doc/contrib/Harrell-statcomp-notes.pdf</ulink>
</simpara>
</listitem>
</itemizedlist>
<simpara>Du côté ouvrage de référence, on pourra citer : <xref linkend="Cleveland1993"/>,
<xref linkend="Wilkinson1999"/>, <xref linkend="Friendly2000"/>, <xref linkend="Murrell2005"/>. Un résumé de ces deux
derniers ouvrages est disponible sur le site de Vincent Zoonekynd
(<ulink url="http://zoonek.free.fr">http://zoonek.free.fr</ulink>).</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/cleveland.jpg"/>
  </imageobject>
  <textobject><phrase>cleveland.jpg</phrase></textobject>
</inlinemediaobject>
<inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/wilkinson.jpg"/>
  </imageobject>
  <textobject><phrase>wilkinson.jpg</phrase></textobject>
</inlinemediaobject>
<inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/friendly.jpg"/>
  </imageobject>
  <textobject><phrase>friendly.jpg</phrase></textobject>
</inlinemediaobject>
<inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/murell.jpg"/>
  </imageobject>
  <textobject><phrase>murell.jpg</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>Les figures proposées sont au format <literal>png</literal> et ont été produites à
l'aide de la commande :</simpara>

<literallayout class="monospaced">png("file.png",width=500,height=500,pointsize=12,bg="white")</literallayout>
<simpara>La liste des fonctions graphiques utilisées peut être consultée
directement à partir de l'index situé en fin de document.</simpara>

<note><simpara>Ce document est plutôt &#8220;mal organisé&#8221;, et le lecteur intéressé
pourra consulter un autre document, peut-être un peu mieux structuré
et rédigé avec <literal>LaTeX + Sweave</literal>. Le document est disponible à cette
adresse : Analyse exploratoire des données avec
R[http://www.aliquote.org/articles/tech/aed/aed.pdf]. Celui-ci est
beaucoup plus orienté sur l'utilisation des graphiques en fonction du
type d'analyse effectué (ANOVA, Régression, etc.) et de l'objectif
recherché (exploration, diagnostic, synthèse).</simpara></note>
<sidebar>
<title>Avertissement</title>
<simpara>Ce document est en cours de construction (au cas où cela ne se verrait
pas dans les premiers paragraphes, le lecteur s'en rendra vite compte
par la suite&#8230;</simpara>

</sidebar>
</section>
<section>
<title>La gestion des graphiques sous <emphasis role="strong">R</emphasis></title>
<simpara>Il existe deux principaux types de systèmes graphiques sous <emphasis role="strong">R</emphasis> :
<literal>grid</literal> et <literal>lattice</literal>.</simpara>

</section>
<section>
<title>Variables numériques</title>
<section>
<title>Histogramme et estimateur de densité</title>
<simpara>L'histogramme est un outil très utile pour visualiser la répartition
des valeurs d'une variable numérique. Cependant, le choix de
l'intervalle de découpage des valeurs n'est pas toujours aisé. En
effet, avec un intervalle trop faible, on fait apparaître trop de
variations souvent insignifiantes, tandis qu'avec un intervalle trop
élevé les variations de la répartition s'effaçent au profit d'une
distribution peu "discriminante" et ne laissent pas apparaître une
éventuelle distribution bimodale. Le choix de la taille de
l'intervalle s'effectue avec l'option <literal>breaks</literal> de la fonction
<indexterm>
  <primary><literal>hist</literal></primary>
</indexterm>
<literal>hist</literal>.
Si cette option n'est pas renseignée, <emphasis role="strong">R</emphasis> calcule un
intervalle par défaut (option <literal>Sturges</literal>) selon laquelle
<literal>h=range(x)/log2(n)+1</literal>. Il existe également d'autres estimations de la
taille optimale de l'intervalle de classes à partir d'algorithmes
d'optimisation entre biais et variance pour des distributions de
référence considérée comme normales <xref linkend="Venables2002"/> (p. 112). Comme
indiqué dans l'aide en ligne (<literal>?hist</literal>), il faut spécifier la méthode
<literal>Scott</literal> ou <literal>FD</literal> (pour "Friedman-Diaconis"). Pour ces méthodes,
l'intervalle choisi est calculé comme</simpara>

<literallayout class="monospaced">h = 3.5*s*n^(-1/3)</literallayout>
<simpara>(Scott, 1979, voir <xref linkend="Venables2002"/>)</simpara>

<simpara>ou</simpara>

<literallayout class="monospaced">h = 2*R*n^(-1/3)</literallayout>
<simpara>(Freedman &amp; Diaconis, 1981, <emphasis>ibidem.</emphasis>).</simpara>

<simpara>On peut tester la première méthode à l'aide en simulant un jeu
d'observations gaussiennes :</simpara>

<screen>  # on vérifie l'évolution de h(n)
  x &lt;- rnorm(10000)
  n &lt;- length(x)
  h &lt;- vector("numeric",n-1)
  for (i in 2:n) {
    h[i-1] &lt;- (max(x)-min(x))/(log(i,2)+1)
  }
  plot(h,type="l",xlab="n")
  # comparaison entre les choix pour `breaks` et l'option "Sturges"
  xx &lt;- seq(-4,4,by=.01)
  idx &lt;- c(50,20,8)
  par(mfrow=c(2,2))
  hist(x,main="Méthode Sturges",ylab="Densité",ylim=c(0,0.4),proba=T)
  lines(xx,dnorm(xx),col="red",lwd=2)
  legend(1.1,0.4,legend="N(0;1)",lty=1,lwd=2,col="red")
  for (i in idx) {
    hist(x,breaks=seq(-4,4,len=i),main=paste("h=",8/i,"(n=50)"),ylim=c(0,0.4),
      ylab="Densité",proba=T)
    lines(xx,dnorm(xx),col="red",lwd=2)
  }</screen>
<figure><title>Choix de l'intervalle de classe pour un histogramme</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/histo.png"/>
  </imageobject>
  <textobject><phrase>histo.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Des estimateurs locaux de densité sont superposés sur chacun des
graphiques précédents. Ces estimations de densité (non-paramétrique)
sont accessibles à l'aide de la fonction <indexterm>
  <primary><literal>density</literal></primary>
</indexterm>
<literal>density</literal>, qui accepte pour
principaux paramètres :</simpara>

<itemizedlist>
<listitem>
<simpara>
la taille de la fenêtre de lissage ;
</simpara>
</listitem>
<listitem>
<simpara>
le type de noyau à choisir parmi : <literal>"gaussian"</literal>, <literal>"epanechnikov"</literal>,
  <literal>"rectangular"</literal>,<literal>"triangular"</literal>, <literal>"biweight"</literal>, <literal>"cosine"</literal>, et
  <literal>"optcosine"</literal>.
</simpara>
</listitem>
</itemizedlist>
<simpara>On peut voir ce que cela donne en variant le paramètre <literal>adj</literal> :</simpara>

<screen>  y &lt;- rnorm(100,0,(1+2*rbinom(100,1,0.35))) # [Venables2002]
  par(mfrow=c(1,3))
  for (i in seq(0.5,1.5,by=0.5)) {
    hist(y,main=paste("adj=",i),ylim=c(0,0.3),ylab="Densité",proba=T)
    lines(density(y,adj=i),col="blue",lwd=2)
  }</screen>
<figure><title>Influence de la taille de la fenêtre de lissage</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/density.png"/>
  </imageobject>
  <textobject><phrase>density.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Lorsque le paramètre de lissage est faible (e.g. <literal>adj=0.5</literal>), la courbe de
densité souligne beaucoup de variations d'effectifs qui ne semblent
pas particulièrement remarquables, tandis qu'à l'inverse, avec un fort
lissage (<literal>adj=1.5</literal>), seule subsiste la tendance générale unimodale. On
notera que l'asymétrie gauche reste visible, comme avec <literal>adj=1</literal>
(option par défaut sous <emphasis role="strong">R</emphasis>).</simpara>

<simpara>On peut visualiser une démonstration de ce procédé dynamiquement à
l'aide du script suivant : <ulink url="density_tk.R">density_tk.R</ulink>. Ce script
nécessite la librairie <literal>tkrplot</literal>.</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/density_tk_window.png"/>
  </imageobject>
  <textobject><phrase>density_tk_window.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>Voici un autre exemple d'utilisation de l'histogramme sous <emphasis role="strong">R</emphasis>
(<ulink url="hist1.R">hist1.R</ulink>) :</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/hist1.png"/>
  </imageobject>
  <textobject><phrase>hist1.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>On peut enfin s'amuser à reproduire un des exemples données par John
Fox (<ulink url="http://socserv.mcmaster.ca/jfox/">http://socserv.mcmaster.ca/jfox/</ulink>).</simpara>

<screen>  old.par &lt;- par(mar=c(5,4,4,5))
  xx &lt;- c(.2, .5, .8)
  yy &lt;- xx*0.8+0.1
  plot(c(0,1), c(0,1), type="n", axes=FALSE, xlab=expression(Theta), ylab="")
  axis(1, at=xx, labels=c(expression(theta[1]),expression(theta[2]),expression(theta[3])))
  axis(2, at=yy, las=1, labels=c(expression(widehat(y)[1]),
        expression(widehat(y)[2]),expression(widehat(y)[3])))
  axis(4, at=seq(0,1,by=0.5), las=1)
  box()
  # draw the regression line
  abline(0.1,0.8)
  # add normal deviates for each Y|x_i plus corresponding probability
  # density for a binary response
  x &lt;- seq(-3,3,length=100)
  y &lt;- dnorm(x)/2
  threshold &lt;- 0.35
  for (i in 1:3) {
    y1 &lt;- x/12 + yy[i]
    x1 &lt;- y + xx[i]
    lines(x1, y1)
    whichy &lt;- y1&gt;=threshold
    new.x1 &lt;- c(xx[i],x1[whichy])
    new.y1 &lt;- c(y1[whichy][1],y1[whichy])
    polygon(new.x1, new.y1, col="light blue", border=NA)
  }
  abline(h=yy, lty=3, col="gray")
  abline(h=threshold,lwd=3,col="blue")
  mtext(c(expression(Upsilon1),expression(Psi)),side=c(2,4),line=3,las=1)
  par(old.par)</screen>
<figure><title>Une variante de la fonction <literal>densityplot</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex5.png"/>
  </imageobject>
  <textobject><phrase>ex5.png</phrase></textobject>
</mediaobject>
</figure>
</section>
<section>
<title>Graphiques conditionnels</title>
<simpara>La librairie <indexterm>
  <primary><literal>lattice</literal></primary>
</indexterm>
<literal>lattice</literal> offre des possibilités graphiques
additionnelles puisqu'elle propose les mêmes classes d'outils
graphique (histogramme, boîte à moustaches, diagramme, etc.) mais avec
la possibilité d'effectuer des représentations graphiques
conditionnellement aux valeurs ou niveaux d'une variable
concomittante.</simpara>

<screen>  library(ade4)
  library(lattice)
  data(deug)
  x &lt;- deug$tab$Algebra
  y &lt;- deug$result
  densityplot(~x|y,xlab="algèbre",ylab="densité",panel=function(x,...) {
    panel.mathdensity(dmath=dnorm,args=list(mean=mean(x),sd=sd(x)),col="red")
    panel.histogram(x,breaks=NULL,col="cyan")})</screen>
<figure><title>La fonction <literal>densityplot</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/densityplot.png"/>
  </imageobject>
  <textobject><phrase>densityplot.png</phrase></textobject>
</mediaobject>
</figure>
<note>
<title>Exportation des graphiques <literal>lattice</literal></title>
<simpara>On peut également exporter le graphique produit au format
postscript, qui donne un meilleur rendu pour une insertion dans un
document et qui offre la possibilité d'avoir un fond uniforme blanc,
et non pas gris comme par défaut. On utilisera par exemple la commande</simpara>

<literallayout class="monospaced">postscript("densityplot.eps", width = 10.0, height = 10.0,
           horizontal = FALSE, onefile = FALSE, paper = "special",
           encoding = "ISOLatin1.enc")</literallayout>
<simpara>pour produire la figure <ulink url="img/densityplot.eps">densityplot.eps</ulink>.
On veillera dans ce cas à utiliser <literal>print(densityplot(&#8230;))</literal> pour
générer correctement le graphique postscript.</simpara>

</note>
<figure><title>Exemple de distribution conditionnelle</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/sexe_scores.png"/>
  </imageobject>
  <textobject><phrase>sexe_scores.png</phrase></textobject>
</mediaobject>
</figure>
</section>
<section>
<title>Diagrammes de dispersion</title>
<simpara>On peut utiliser ce type de représentation dans le cas où l'on croise
plusieurs variables, par exemple :</simpara>

<screen>  plot(iris[,1:4],bg=c("red","green3","blue")[iris[,5]],
    pch=c(21,25,24)[iris[,5]],main="Les iris de Fisher",
    labels=c("Longueur\nsépale","Largeur\nsépale",
    "Longueur\npétale","Largeur\npétale"))</screen>
<figure><title>Diagramme de dispersion pour les iris de Fisher</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/plotiris.png"/>
  </imageobject>
  <textobject><phrase>plotiris.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>La fonction <indexterm>
  <primary><literal>pairs</literal></primary>
</indexterm>
<literal>pairs</literal> permet également de représenter une matrice
graphique :</simpara>

<screen>  a&lt;-rnorm(100)
  b&lt;-2*a+rnorm(100)
  c&lt;-5*a+rnorm(100)+runif(100)*2
  pairs(cbind(a,b,c))</screen>
<figure><title>Les diagrammes de dispersion multivariables</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex8.png"/>
  </imageobject>
  <textobject><phrase>ex8.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>On peut personnaliser la diagonale de ce graphique grâce à la
librairie</simpara>

<figure><title>Personnalisation du diagramme de dispersion</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/scores_version_pairs_ens.png"/>
  </imageobject>
  <textobject><phrase>scores_version_pairs_ens.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Mais dans le cas où le nombre de points est très important (n &gt; 10000),
cela devient difficile d'exporter directement l'image à moins
d'accepter de gérer des images <literal>postscript</literal> ou <literal>png</literal> de 12 Mo, comme
par exemple l'image suivante !</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/score_corr.png"/>
  </imageobject>
  <textobject><phrase>score_corr.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>La libriarie <indexterm>
  <primary><literal>hexbin</literal></primary>
</indexterm>
<literal>hexbin</literal> fournie avec les extensions de Bioconductor
(<ulink url="http://www.bioconductor.org">www.bioconductor.org</ulink>) permet de
représenter de larges volumes de données :</simpara>

<screen>  library(hexbin)
  # adapted from the example in ?hexbin
  x &lt;- rnorm(10000)
  y &lt;- rnorm(10000)
  plot(hexbin(x, y + x*(x+1)/4), ylab="Y",
       main=expression(frac(X %.% (X+1),4) + Y))</screen>
<figure><title>Diagramme de dispersion optimisé pour les gros volumes de données</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex10.png"/>
  </imageobject>
  <textobject><phrase>ex10.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>On retrouve une représentation des effectifs à peu près comparable
dans le package <indexterm>
  <primary><literal>survey</literal></primary>
</indexterm>
<literal>survey</literal>.
Dans un premier temps, on peut représenter les points de coordonnées
<literal>(x,y)</literal> avec une taille qui est proportionnelle à l'effectif associé:</simpara>

<screen>  # from ?svyplot
  data(api)
  dstrat&lt;-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc)

  svyplot(api00~api99, design=dstrat, style="bubble")</screen>
<figure><title>Application pour la représentation des données de sondage</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex11.png"/>
  </imageobject>
  <textobject><phrase>ex11.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>ou alors faire appel à une représentation reposant sur la librarie
<indexterm>
  <primary><literal>hexbin</literal></primary>
</indexterm>
<literal>hexbin</literal> grâce à l'option <literal>style="hex"</literal>:</simpara>

<screen>  svyplot(api00~api99, design=dstrat, style="hex", xlab="1999 API",
          ylab="2000 API")
  svyplot(api00~api99, design=dstrat, style="grayhex",legend=0)</screen>
<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/ex12_1.png"/>
  </imageobject>
  <textobject><phrase>ex12_1.png</phrase></textobject>
</inlinemediaobject>
<inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/ex13_1.png"/>
  </imageobject>
  <textobject><phrase>ex13_1.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>La librarie <indexterm>
  <primary><literal>ggplot</literal></primary>
</indexterm>
<literal>ggplot</literal> (remplacée par <indexterm>
  <primary><literal>ggplot2</literal></primary>
</indexterm>
<literal>ggplot2</literal> à l'heure actuelle)
permet également ce type de représentation :</simpara>

<figure><title>Utilisation de la librairie <literal>ggplot</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex14.png"/>
  </imageobject>
  <textobject><phrase>ex14.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>En dernier lieu, on peut imager une représentation de densité 2D avec</simpara>

</section>
<section>
<title>Boîtes à moustaches</title>
<screen>  ns    &lt;- c(15,28,10,20,35)
  n     &lt;- length(ns)
  group &lt;- factor(rep(1:n,ns),labels=paste("g",1:n,sep=""))
  data  &lt;- rnorm(length(group),mean=100+(as.numeric(group)-2)^2)
  boxplot(data~group,border=1:n,xlab="Groupe",ylab="Réponse",varwidth=T)
  for (i in 1:n) {
    rug(data[as.numeric(group)==i],side=2,col=i)
  }</screen>
<figure><title>Boîte à moustaches et projection de la distribution univariée</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/boxplot.png"/>
  </imageobject>
  <textobject><phrase>boxplot.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Il peut être intéressant de superposer sur cette représentation
synthétique de la distribution de la variable étudiée la distribution
univariée des observations :</simpara>

<screen>  x &lt;- rnorm(20,mean=20,sd=2.5)
  y &lt;- rnorm(20,mean=22,sd=2.3)

  boxplot(x,y)
  points(c(rep(1,20),rep(2,20)),c(x,y),col='gray50')
  points(c(1,2),c(mean(x),mean(y)),pch='x',cex=2,col=c('blue','red'))</screen>
<figure><title>Boîte à moustaches et distribution des observations</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex1.png"/>
  </imageobject>
  <textobject><phrase>ex1.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Les paramètres graphiques sont extrêmement faciles à moduler et il est
très facile d'obtenir des figures un peu plus &#8220;sexy&#8221; :</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/scores_version.png"/>
  </imageobject>
  <textobject><phrase>scores_version.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>On peut également utiliser la fonction <indexterm>
  <primary><literal>stripchart</literal></primary>
</indexterm>
<literal>stripchart</literal> qui permet de ne
pas superposer les points les uns sur les autres (utile quand il y a
beaucou d'observations et que certaines d'entre elles prennent la même
valeur), comme ceci :</simpara>

<screen>  y &lt;- rnorm(1000)
  x &lt;- gl(4,25,1000,labels=paste("g",1:4,sep=""))
  stripchart(y~x,method="jitter",ylab="Y",xlab="X",vertical=T)
  (moy &lt;- as.numeric(tapply(y,x,mean)))
  points(1:4,moy,pch="X",col='blue',cex=2)
  lines(1:4,moy,col='blue',lwd=2)</screen>
<figure><title>Représentation de la distribution des observations avec <literal>stripchart</literal> (option <literal>jitter</literal>)</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex2.png"/>
  </imageobject>
  <textobject><phrase>ex2.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>L'option <literal>method="stack"</literal> peut également se révéler intéressante :</simpara>

<screen>  y &lt;- rpois(500,10)
  x &lt;- gl(4,25,500,labels=paste("g",1:4,sep=""))
  stripchart(y~x,method="stack",ylab="Y",xlab="X",vertical=T)</screen>
<figure><title>Représentation de la distribution des observations avec <literal>stripchart</literal> (option <literal>stack</literal>)</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex3.png"/>
  </imageobject>
  <textobject><phrase>ex3.png</phrase></textobject>
</mediaobject>
</figure>
</section>
</section>
<section>
<title>Variables qualitatives</title>
<section>
<title>Distributions univariées</title>
<simpara>Les graphiques en barres sont sans doute les plus utilisés dans le
cadre de la représentation de la distribution des effectifs en
fonction des modalités d'une variable qualitative. Sous <emphasis role="strong">R</emphasis>, on peut
les générer grâce à la fonction <indexterm>
  <primary><literal>barplot</literal></primary>
</indexterm>
<literal>barplot</literal>.</simpara>

<screen>  x1 &lt;- c(23.2,34.5,76.3,65.8,12.6)
  x2 &lt;- c(15.6,12.4,21.8,20,5.2)
  A &lt;- gl(5,1,5,labels=c("a1","a2","a3","a4","a5"))
  data &lt;- cbind(x1,x2)
  rownames(data) &lt;- levels(A)
  barplot(x1,names.arg=levels(A))
  barplot(t(data),beside=T,ylim=c(0,100),legend.text=colnames(data),
    col=c("grey50","grey80"),ylab="Fréquence")</screen>
<figure><title>Exemple de diagramme en barres avec <literal>barplot</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/barplot.png"/>
  </imageobject>
  <textobject><phrase>barplot.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>L'option <literal>beside=TRUE</literal> permet de ne pas superposer les différentes
catégories, ce qui est parfois plus lisible.</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/financement.png"/>
  </imageobject>
  <textobject><phrase>financement.png</phrase></textobject>
</inlinemediaobject></simpara>

<simpara>On peut également utiliser une boîte à camembert pour représenter les
effectifs ventilés sur les modalités de la variable d'intérêt :</simpara>

<screen>  names(x1) &lt;- levels(A)
  pie(x1/100)</screen>
<figure><title>Les diagrammes circulaires (&#8220;camemberts&#8221;)</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/pie.png"/>
  </imageobject>
  <textobject><phrase>pie.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Remarquons cependant que ces représentations dans lesquelles les
proportions relatives sont évaluées par des secteurs angulaires
deviennent vite difficiles à analyser lorsqu'il y a beaucoup de
modalités (cf. Cleveland (1985), page 264 <footnote><simpara>"Data that can be
shown by pie charts always can be shown by a dot chart. This means
that judgements of position along a common scale can be made instead
of the less accurate angle judgements." This statement is based on the
empirical investigations of Cleveland and McGill as well as
investigations by perceptual psychologists. (<literal>?pie</literal>)</simpara></footnote>) ou lorsque l'on
souhaite croiser différentes variables, et il est préférable
d'utiliser des diagrammes en barres.</simpara>

<simpara>On peut utiliser cette représentation en barre dans le cas d'une
variable continue ventilée sur différentes modalités :</simpara>

<screen>  y &lt;- c(rnorm(50,mean=20),rnorm(50,mean=15,sd=3))
  x1 &lt;- gl(2,50,100,labels=paste("c",1:2,sep=""))
  x2 &lt;- factor(rep(1:4,25),labels=letters[1:4])
  y.means &lt;- tapply(y,list(x1,x2),mean)
  y.sd &lt;- tapply(y,list(x1,x2),sd)

  my.barplot &lt;- function(data, err, ...) {
    tmp &lt;- barplot(data, ...)
    if (length(err) != length(data))
        stop("la longueur de 'data' et 'err' ne correspond pas")
    for (i in 1:length(err))
        arrows(tmp[i],data[i]-err[i],tmp[i],data[i]+err[i],
               code=3,angle=90,length=0.08)
  }

  my.barplot(y.means,y.sd,beside=T,ylab="Y",xlab="X2",
             ylim=c(0,26),names.arg=levels(x2),legend.text=levels(x1),
             cex.axis=.7,cex.names=.7,cex.lab=.7)</screen>
<figure><title>Personnaliser la fonction <literal>barplot</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex6.png"/>
  </imageobject>
  <textobject><phrase>ex6.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>On peut encore pousser la personnalisation un peu plus loin :</simpara>

<screen>  a &lt;- matrix(NA,nrow=8,ncol=2)
  a[,1] &lt;- rev(c(2,3,3,6,5,12,15,20))
  a[,2] &lt;- rev(c(1,4,2,3,9,10,30,30))
  rownames(a) &lt;- LETTERS[1:8]
  colnames(a) &lt;- c("1","2")
  cols &lt;- c(rgb(105/255,166/255,233/255),
            rgb(180/255,210/255,244/255),
            rgb(0/255,78/255,162/255))

  a.prop &lt;- round(a/sum(a)*100,2)
  a.margin &lt;- apply(a,1,sum)
  x.offset &lt;- 25

  par(mar=c(5,6,4,2))
  bp &lt;- barplot(t(a),names.arg=rownames(a),horiz=T,col=cols[1:2],
                las=1,xlab="Effectif",main="",xlim=c(0,max(a.margin)+x.offset),
                border=cols[3])
  legend("topright",c("1","2"),pch=rep(19,2),col=cols[1:2],bty="n")
  labs &lt;- paste(paste(as.character(a.prop[,1]),"%",sep=""),
                paste(as.character(a.prop[,2]),"%",sep=""),sep=" / ")
  text(a.margin,bp,labs,pos=4,cex=.8)</screen>
<figure><title>Personnaliser la fonction <literal>barplot</literal> (2)</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/ex7.png"/>
  </imageobject>
  <textobject><phrase>ex7.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>ou écrire une fonction qui permettent de représenter conjointement une
distribution exprimée en termes d'effectifs et de fréquences :
<ulink url="my.barplot.R">my.barplot.R</ulink>.</simpara>

<simpara>Autre type de personnalisation possible :</simpara>

<simpara><inlinemediaobject>
  <imageobject>
  <imagedata fileref="img/pays2.png"/>
  </imageobject>
  <textobject><phrase>pays2.png</phrase></textobject>
</inlinemediaobject></simpara>

</section>
<section>
<title>Représentations conjointes</title>
<simpara>Il existe plusieurs fonctions utiles dans le cadre de la
représentation des effectifs ventilés sur les modalités de deux
variables qualitatives. Ces méthodes de représentation permettent
d'éviter l'éventuel superposition des points telle qu'on peut
l'observer dans un simple diagramme de dipersion.</simpara>

<simpara>Par exemple, la fonction <indexterm>
  <primary><literal>sunflowerplot</literal></primary>
</indexterm>
<literal>sunflowerplot</literal> représente les effectifs
sous forme de diagramme étoilé pour chacun des croisements des
modalités des variables :</simpara>

<screen>  x &lt;- rpois(500,lambda=2)
  y &lt;- rpois(500,lambda=2)
  layout(t(matrix (1:2)))
  plot(x,y,pch=19)
  sunflowerplot(x,y,pch=19)</screen>
<figure><title>Diagramme en étoiles</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/sunflowerplot.png"/>
  </imageobject>
  <textobject><phrase>sunflowerplot.png</phrase></textobject>
</mediaobject>
</figure>
<simpara>Dans le cas de deux variables dichotomiques (e.g. en épidémiologie,
exposition <emphasis>vs.</emphasis> maladie), on peut utiliser une représentation en quarts
de cercle de l'association entre les deux variables :</simpara>

<screen>  x &lt;- c(24.3,75.7,16.8,83.2)
  a &lt;- matrix(x,nr=2,byrow=T)
  var1 &lt;- c("E-","E+")
  var2 &lt;- c("M-","M+")
  dimnames(a) &lt;- list(var2,var1)
  fourfoldplot(a)</screen>
<figure><title>Diagramme en quart de cercle</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/fourfoldplot.png"/>
  </imageobject>
  <textobject><phrase>fourfoldplot.png</phrase></textobject>
</mediaobject>
</figure>
</section>
<section>
<title>Représentations conditionnelles</title>
<simpara>Voici un exemple d'utilisation d'un diagramme de fréquence
conditionnel (deux variables qualitatives), d'après l'exemple trouvé
dans l'aide en ligne (<literal>?dotchart</literal>) :</simpara>

<screen>  dotchart(VADeaths, main = "Death Rates in Virginia - 1940")</screen>
<figure><title>Distribution de données circulaires</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/circular.png"/>
  </imageobject>
  <textobject><phrase>circular.png</phrase></textobject>
</mediaobject>
</figure>
</section>
</section>
<section>
<title>Données de survie</title>
<simpara>A faire.</simpara>

</section>
<section>
<title>Séries temporelles</title>
<simpara>Avec les données contenues dans l'image
<ulink url="data/ex_st.Rdata">ex_st.Rdata</ulink>, on peut illustrer quelques-unes
des facilités de <emphasis role="strong">R</emphasis> pour la personnalisation des graphiques.</simpara>

<screen>  load("ex_st.Rdata")
  offset &lt;- 100
  xx &lt;- 1:length(a.mean[,1])*0.01 # le temps en secondes (@100 Hz)
  plot(xx,a.mean[,1],type="n",xlab="Temps (s)",ylab="",ylim=c(-200,200),
    main="a",axes=F)
  xsda &lt;- c(xx,rev(xx))
  ysda &lt;- c(a.mean[,1]+(a.sd[,1]/2)+offset,rev(a.mean[,1]-(a.sd[,1]/2)+offset))
  polygon(xsda,ysda,col="grey",border=NA)
  xsdb &lt;- c(xx,rev(xx))
  ysdb &lt;- c(b.mean[,1]+b.sd[,1]-offset,rev(b.mean[,1]-b.sd[,1]-offset))
  polygon(xsdb,ysdb,col="grey",border=NA)
  lines(xx,a.mean[,1]+offset,type="l",lwd=2)
  lines(xx,b.mean[,1]-offset,type="l",lwd=2,lty=2)
  axis(1)
  xx &lt;- 0
  yy &lt;- 0
  lwb &lt;- yy-15;
  upb &lt;- yy+15;
  arrows(xx,lwb,xx,upb,length=0,angle=90,code=3)
  text(xx+.05,yy,labels="30 pix.",pos=4)
  text(0,180,"CL",cex=1.5,font=2,pos=4)</screen>
<figure><title>Evolution d'une série chronologique</title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/st1.png"/>
  </imageobject>
  <textobject><phrase>st1.png</phrase></textobject>
</mediaobject>
</figure>
</section>
<section>
<title>Données spatiales</title>
<simpara>A faire.</simpara>

</section>
<section>
<title>Divers</title>
<simpara>La librarie <indexterm>
  <primary><literal>pixmap</literal></primary>
</indexterm>
<literal>pixmap</literal> permet d'afficher des images au format <literal>ppm</literal>
sur une fenêtre graphique.</simpara>

<simpara>Par exemple, on peut afficher un ensemble de drapeaux sous forme de
matrice dans un graphique :</simpara>

<screen>  library(pixmap)
  my.path &lt;- "./flags.pnm"
  scale &lt;- 1/50
  dx &lt;- 2.75
  dy &lt;- 1
  flags &lt;- list.files(path=my.path, full.names=T)
  N &lt;- length(pays.prop)

  par(mar=c(2,2,2,2))
  plot(seq(0,16),seq(0,16),ylim=c(0,8),type="n",axes=F)
  k &lt;- 0
  for (i in 1:5) {
    for (j in 1:6) {
      k &lt;- k+1
      if (k == N) break  # prevents from exceeding max number of flags (28 &lt; 30)
      x &lt;- read.pnm(flags[grep(names(pays.prop[k]),flags)])
      # Note: all flags are 81x54 pixels
      addlogo(x, px=c(j-dx+1.75*j,j-dx+1.75*j+1.5),py=c(i-dy+.5*i,i-dy+.5*i+.75))
      text(j-dx-.25+1.75*j,i-dy+.5*i-.25,names(pays.prop[k]),pos=4,cex=.7)
      text(j-dx+1.75*j+1.25,i-dy+.5*i+.5,paste(pays.prop[k],"%",sep=""),pos=4,cex=.8)
    }
  }
  title(main="Localisation géographique des associations")
  text(12,7,paste("N=",sum(pays),"associations",sep=" "),pos=4,cex=.8)</screen>
<figure><title>Représenter des cartes grâce à <literal>pixmap</literal></title>
<mediaobject>
  <imageobject>
  <imagedata fileref="img/pays_v2.png"/>
  </imageobject>
  <textobject><phrase>pays_v2.png</phrase></textobject>
</mediaobject>
</figure>
</section>
<section>
<title>Références</title>
<bibliomixed>
<bibliomisc>
<anchor id="Venables2002" xreflabel="[Venables2002]"/>[Venables2002] Venables, W.N. &amp; Ripley, B.D. (2002). <emphasis>Modern
  Applied Statistics with S</emphasis>. Springer-Verlag.
</bibliomisc>
</bibliomixed>
<bibliomixed>
<bibliomisc>
<anchor id="Everitt2005" xreflabel="[Everitt2005]"/>[Everitt2005] Everitt, B. (2005). <emphasis>An R and S-PLUS Companion to
  Multivariate Analysis</emphasis>. Springer-Verlag.
</bibliomisc>
</bibliomixed>
<bibliomixed>
<bibliomisc>
<anchor id="Cleveland1993" xreflabel="[Cleveland1993]"/>[Cleveland1993] William S. Cleveland (1993). <emphasis>Visualizing
  Data</emphasis>. Hobart Press.
</bibliomisc>
</bibliomixed>
<bibliomixed>
<bibliomisc>
<anchor id="Wilkinson1999" xreflabel="[Wilkinson1999]"/>[Wilkinson1999] Leland Wilkinson (1999). <emphasis>The Grammar of
  Graphics</emphasis>. Springer-Verlag.
</bibliomisc>
</bibliomixed>
<bibliomixed>
<bibliomisc>
<anchor id="Friendly2000" xreflabel="[Friendly2000]"/>[Friendly2000] Michael Friendly (2000). <emphasis>Visualizing Categorical
    Data</emphasis>. SAS Publishing.
</bibliomisc>
</bibliomixed>
<bibliomixed>
<bibliomisc>
<anchor id="Murrell2005" xreflabel="[Murrell2005]"/>[Murrell2005] Paul Murrell (2005). <emphasis>R Graphics</emphasis>. Chapman &amp;
  Hall/CRC.
</bibliomisc>
</bibliomixed>
</section>
<index>
<title>Index</title>
</index>
</article>
