Aligner les zéros des axes principaux et secondaires

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Eva Dieudonné
Messages : 2
Enregistré le : 31 Aoû 2016, 12:37

Aligner les zéros des axes principaux et secondaires

Messagepar Eva Dieudonné » 01 Sep 2016, 09:49

Bonjour à tous,

Je cherche à réaliser un graphique générique permettant des visualiser les évolutions des importations et exportations, en quantité et en valeur, d'une espèce donnée. Mon graphique est donc composé d'un axe principal (données en quantité) et d'un axe secondaire (données en valeur).

Or il se trouve que pour certaines espèces, les zéros des axes principaux et secondaires sont décalés alors que j'aimerais qu'ils soient alignés (afin de faciliter la lecture du graphique). Pouvez vous m'aider ?

Voici un exemple de données avec lesquelles je rencontre ce problème:

Code : Tout sélectionner

Qte <- structure(c(11, 14, -3, 13, 15, -2, 13, 17, -4, 14, 17, -3, 13,
16, -3, 15, 23, -8, 16, 18, -2, 17, 19, -2, 17, 19, -2, 19, 22,
-3, 22, 26, -4, 22, 23, -1, 20, 17, 3, 19, 18, 1, 20, 20, 0,
22, 21, 1), .Dim = c(3L, 16L), .Dimnames = list(c("EXPORT", "IMPORT",
"BALANCE"), c("2000", "2001", "2002", "2003", "2004", "2005",
"2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013",
"2014", "2015")))

Val <- structure(c(31, 32, -1, 34, 38, -4, 39, 43, -4, 42, 44, -2, 43,
46, -3, 45, 53, -8, 55, 59, -4, 71, 66, 5, 63, 60, 3, 65, 67,
-2, 82, 82, 0, 100, 88, 12, 100, 81, 19, 111, 90, 21, 115, 98,
17, 118, 94, 24), .Dim = c(3L, 16L), .Dimnames = list(c("EXPORT",
"IMPORT", "BALANCE"), c("2000", "2001", "2002", "2003", "2004",
"2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012",
"2013", "2014", "2015")))

Et voici le script me permettant de réaliser le graphique:

Code : Tout sélectionner

library(RColorBrewer)
Liste_annee <- c(2000:2015)
couleur<-c(palette(brewer.pal(12,"Paired")))
par(mfrow=c(1,1))
par(mar=c(7,4,1,4.5),xpd = NA)
bp <- barplot(Qte, ylab="Quantity (1000 tonnes)", beside=T,
      col=c(couleur[3],couleur[1],couleur[5]))
par(new=TRUE,mar=c(7,4,1,4.5),xpd = NA)
matplot(Liste_annee,t(Val),
        type="o",lwd=2,pch=16,lty="dotdash",
        col=c(couleur[4],couleur[2],couleur[6]),
        xlab="",ylab="",axes=F)
axis(4)
legend(x=Liste_annee[1],y=min(Val)+2*min(Val),
       legend = c("Q Export", "V Export", "Q Import", "V Import", "Q Balance", "V Balance"), ncol = 3,
       col = c(couleur[3],couleur[4],couleur[1],couleur[2],couleur[5],couleur[6]),
       pch = c(15,16), pt.cex=c(2,1), lty=c(NA,"dotdash"),
       bty = "o", horiz = F)
text(Liste_annee[length(Liste_annee)]+1.5, 0, "Value (million euro)", pos = 4, srt = 90)

Merci d'avance pour votre aide

Bonne journée,

Eva

Didier Plat
Messages : 225
Enregistré le : 02 Nov 2009, 16:47
Contact :

Re: Aligner les zéros des axes principaux et secondaires

Messagepar Didier Plat » 01 Sep 2016, 12:32

Bonjour,
Voici quelques propositions de changement. L'ajout de ylim et de yaxs dans les 2 tracés permet de "fixer" des bornes identiques ; d'autre part, pour matplot, j'utiliserai, pour définir les valeurs de x, bp[2,] plutôt que Liste_annee afin que les points soient systématiquement centrés sur la barre du milieu (sinon, ils se "déplacent" progressivement du bord extérieur droit pour l'année 1 au bord extérieur gauche pour la dernière année) :

Code : Tout sélectionner

library(RColorBrewer)
Liste_annee <- c(2000:2015)
couleur<-c(palette(brewer.pal(12,"Paired")))
#par(mfrow=c(1,1))
op <- par(no.readonly=TRUE)
par(mar=c(7,4,1,4.5),xpd = NA)
bp <- barplot(Qte, ylab="Quantity (1000 tonnes)", beside=T,
      col=c(couleur[3],couleur[1],couleur[5]),
      ylim=c(min(Qte, Val), max(Qte, Val)), yaxs="i")
#par(new=TRUE,mar=c(7,4,1,4.5),xpd = NA)
matplot(bp[2,],t(Val),
        type="o",lwd=2,pch=16,lty="dotdash",
        col=c(couleur[4],couleur[2],couleur[6]),
        xlab="",ylab="",axes=F,
        ylim=c(min(Qte, Val), max(Qte, Val)), yaxs="i", add=TRUE)
axis(4)
legend(x=Liste_annee[1],y=min(Val)+2*min(Val),
       legend = c("Q Export", "V Export", "Q Import", "V Import", "Q Balance", "V Balance"), ncol = 3,
       col = c(couleur[3],couleur[4],couleur[1],couleur[2],couleur[5],couleur[6]),
       pch = c(15,16), pt.cex=c(2,1), lty=c(NA,"dotdash"),
       bty = "o", horiz = F)
text(Liste_annee[length(Liste_annee)]+1.5, 0, "Value (million euro)", pos = 4, srt = 90)
par(op)

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Re: Aligner les zéros des axes principaux et secondaires

Messagepar Nicolas Péru » 01 Sep 2016, 12:54

Bonjour,

Autre solution, qui permet de conserver l'aspect initial des barres mais qui ne fait pas un alignement aussi propre de tous les points clefs des axes.
Le décalage de 0 s'opère en raison de la différence d'échelle des axes issus des 2 jeux de données que tu veux forcer dans un même espace graphique.

Tu peux, pour contourner le problème, utiliser un facteur correctif correspondant à minima au ratio du range des 2 axes. Dans le code ci-dessous j'ai mis 40/200 pour prendre une marge par rapport aux ranges observés dans les données Val et Qte. Ce ratio, fixé dans le code ci-dessous, peut être évaluée à partir des jeux de données en regardant les ranges propres à chacun et en faisant un arrondi de chacun à la dizaine sup puis faire le ratio.

Ensuite on "triche" sur l'axe de droite en affichant les valeurs des données initiales et non les valeurs réelles du graphiques (correction au facteur 40/200)

Code : Tout sélectionner

par(mar=c(7,4,1,4.5),xpd = NA)
bp <- barplot(Qte, ylab="Quantity (1000 tonnes)", beside=T,
       col=c(couleur[3],couleur[1],couleur[5]))
matpoints(t(bp),t(Val)*40/200,
         type="b",lwd=2,pch=16,lty="dotdash",xlab="",ylab="",axes=F,
         col=c(couleur[4],couleur[2],couleur[6]))
axis(4,at=seq(-20,120,20)*40/200,labels=seq(-20,120,20))
.

cela te permet au passage de te passer du par(new=T) et d'utiliser directement la fonction matpoints à la place de matplot.Comme Didier je souligne qu'il faut utiliser l'objet bp pour placer tes points.

C'est peut être jouable d'aligner les max et min des 2 axes mais je n'ai pas été plus loin.

Nicolas

Eva Dieudonné
Messages : 2
Enregistré le : 31 Aoû 2016, 12:37

Re: Aligner les zéros des axes principaux et secondaires

Messagepar Eva Dieudonné » 01 Sep 2016, 15:27

Bonjour,

Merci beaucoup pour vos deux solutions astucieuses. J'avais effectivement aussi ce problème de points qui se décalent, voilà qui est résolu !

Merci encore et bonne journée :)

Eva


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité