Habillage d'un graphique

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

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Habillage d'un graphique

Messagepar Brice Mora » 12 Nov 2007, 16:52

Bonjour,

je débute sur R et je souhaite faire un graphique "boxplot". Le code que j'ai trouvé me permet presque de faire ce que je souhaite (voir plus bas).
Voici mes 3 problèmes:
- je n'arrive pas à rejoindre les deux axes à l'origine en bas à gauche
- le titre de mon graphique ne s'ajuste pas à la fenêtre du graphique
- je souhaite incliner à 45° deg. les labels de l'axe des x. Est-ce possible?

Voici mon code:

Code : Tout sélectionner

# creation d une liste des donnees (les Sx sont des vecteurs de nombres)
mesureS<-c(s1,s2,s3,s4,s5,s6,s7)

# creation d'une liste de labels pour axe des x
labels<- c('variable M', 'variable S','variable D','variable F','variable G','variable W','variable Q')

# write results of next graphic command to a jpg file
jpeg(filename="D:/test.jpg")

# création du graphe
boxplot (mesureS, xlab="", ylab="Taux de conflit", axes=F)

# Increase bottom margin by 0.1
par(omi=c(0.05,0,0,0))

# Add perpendicular labels
axis(1, at=1:length(labels), labels=labels, las=2)
axis (2)

# close the graphics device
dev.off()


Je vous remercie par avance pour votre aide.
Brice

Romain François
Messages : 42
Enregistré le : 08 Déc 2005, 19:23
Contact :

Messagepar Romain François » 12 Nov 2007, 17:01

- je n'arrive pas à rejoindre les deux axes à l'origine en bas à gauche


Code : Tout sélectionner

?box


- je souhaite incliner à 45° deg. les labels de l'axe des x. Est-ce possible?


Peut etre avec :

Code : Tout sélectionner

par( srt  = 45 )
--
Romain François
Consultant R Indépendant
http://romainfrancois.blog.free.fr

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Messagepar Brice Mora » 12 Nov 2007, 18:00

j'ai ajouté:

Code : Tout sélectionner

box(lty = "solid")

sous ma ligne 'boxplot'. Elle fait bien ce que je recherche après avoir ajusté les params de la commande 'par' comme suit :

Code : Tout sélectionner

par(omi=c(0.001,0,0,0)


MAIS j'ai un nouveau pbm: les noms des labels en x sortent du cadre de l'image qui est générée. Comment puis-je l'agrandir? Je n'ai pas trouvé de solution.

Ensuite j'ai ajouté la commande 'srt' comme suit dans mon code:

Code : Tout sélectionner

par(omi=c(0.05,0,0,0),srt = 45)

mais cela ne donne aucun résultat, pourtant on le trouve bien dans le help de la fonction 'par'.

Quelqu'un a une idée?
pour l'ajustement du titre également?

Merci pour ces avancements.
Brice

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 12 Nov 2007, 18:24

Les paramètres graphiques modifiables avec la fonction par() sont très bien décris dans le document suivant:

http://pbil.univ-lyon1.fr/R/fichestd/tdr75.pdf

Il y a notamment un exemple d'inclinaison des étiquettes avec srt page 37.


- Pour modifier la taille du titre voir par (cex.main= )

- \n pour passer à la ligne



Aurélien

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Habillage d'un graphique

Messagepar Renaud Lancelot » 12 Nov 2007, 18:48

Brice Mora a écrit :Bonjour,

je débute sur R et je souhaite faire un graphique "boxplot". Le code que j'ai trouvé me permet presque de faire ce que je souhaite (voir plus bas).
Voici mes 3 problèmes:
- je n'arrive pas à rejoindre les deux axes à l'origine en bas à gauche
- le titre de mon graphique ne s'ajuste pas à la fenêtre du graphique
- je souhaite incliner à 45° deg. les labels de l'axe des x. Est-ce possible?

Voici mon code:

Code : Tout sélectionner

# creation d une liste des donnees (les Sx sont des vecteurs de nombres)
mesureS<-c(s1,s2,s3,s4,s5,s6,s7)


Avec votre syntaxe, mesureS est un vecteur ==> une seule boîte à moustaches.

Code : Tout sélectionner

# creation d'une liste de labels pour axe des x
labels<- c('variable M', 'variable S','variable D','variable F','variable G','variable W','variable Q')

# write results of next graphic command to a jpg file
jpeg(filename="D:/test.jpg")

# création du graphe
boxplot (mesureS, xlab="", ylab="Taux de conflit", axes=F)

# Increase bottom margin by 0.1
par(omi=c(0.05,0,0,0))

# Add perpendicular labels
axis(1, at=1:length(labels), labels=labels, las=2)
axis (2)

# close the graphics device
dev.off()


Je vous remercie par avance pour votre aide.
Brice


Pas simple avec la fct boxplot d'orienter les étiquettes de axes à 45°. C'est plus facile avec le fct bwplot du package lattice mais ne vaut-il pas mieux orienter les boîtes horizontalement: résultat plus lisible.

Exemple:

1. Avec boxplot

Code : Tout sélectionner

# donnée bidon
for(i in 1:6)
  assign(paste("s", i, sep = ""), rnorm(100, runif(1), .1))
labels <- paste("variable", c("M", "S", "D", "F", "G", "W"))

# graphique
par(mar = c(6, 4, 1, 1), xpd = NA)
boxplot(s1, s2, s3, s4, s5, s6,
        xlab = "", ylab="Taux de conflit", axes=FALSE)

axis(1, at = 1:6, labels = rep("", 6))
axis(2)
box()

miny <- min(c(s1, s2, s3, s4, s5, s6))

text(x = 1:6, y = miny - .1, labels, srt = 45, adj = 1)


2. Avec bwplot

Code : Tout sélectionner

Data <- data.frame(y = c(s1, s2, s3, s4, s5, s6),
                   x = rep(paste("variable", c("M", "S", "D", "F", "G", "W")),
                           each = 100))

library(lattice)
bwplot(y ~ x, data = Data, horizontal = FALSE,
       ylab = "Taux de conflit",
       scales = list(x = list(at = 1:6, labels = labels, rot = 45)))


3. Même chose mais boites horizontales:

Code : Tout sélectionner

bwplot(x ~ y, data = Data, xlab = "Taux de conflit")


Renaud

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Messagepar Brice Mora » 13 Nov 2007, 02:56

Renaud: merci pour ton code. je le testerai plus en profondeur plus tard. je n ai pas reussi à l exploiter de manière satisfaisante.

Sinon, en cherchant une explication sur "cex.main" sur le net j ai trouvé son utilisation dans la fonction 'text'.
Le code suivant a résolu mon pbm:

Code : Tout sélectionner

title("Mon titre",font.main=1,adj=0.5,cex.main=1)


Merci Aurélien pour ce coup de pouce.

Sinon je n'ai pas réussi à incliner le texte des labels en x avec le code de la page 37 du document proposé. Le premier label apparaît en partie seulement, tout en haut du graphique.
J ai utilisé ce code sans succès:

Code : Tout sélectionner

boxplot (tousconflits, xlab="", ylab="Taux de conflit", axes=F)
box(lty = "solid")

title("mon titre",font.main=1,adj=0.5,cex.main=1)

par(omi=c(0.001,0,0,0))

axis(1, at=1:length(labels), labels=FALSE)
text(x=1:7,y=NULL, labels=labels, srt = 45, adj= c(0.5, 0.1))
axis (2)


Ceci dit, je pourrais me contenter d un texte vertical. Mais ayant ajusté les valeurs du paramètre 'omi' dans la fct 'par' pour que les axes de définis par 'box' et axis se superposent parfaitement, la première lettre des plus longs labels est confondue avec le bord noir de l'image. Comment faire pour avoir de l'espace (j ai essayé de mettre des espaces au début des labels sans succès)?

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

Messagepar Nicolas Péru » 13 Nov 2007, 06:39

Ceci dit, je pourrais me contenter d un texte vertical. Mais ayant ajusté les valeurs du paramètre 'omi' dans la fct 'par' pour que les axes de définis par 'box' et axis se superposent parfaitement, la première lettre des plus longs labels est confondue avec le bord noir de l'image.


j'ai du mal à suivre en ce qui concerne la superposition des axes. Ces derniers ne doivent être définit que par la fonction axis(). Ton erreur est sans doute là.

Code : Tout sélectionner

axis(1, at=1:length(labels), labels=labels, las=2)
axis (2)



en spécifiant "at=1:x" tu lui dis de mettre des tickmarks en commançant à un. Essaye en lui mettant at = 0:length(labels) et labels=c(0,labels)
Il me semble que tu devrais avoir des axes qui se rejoignent et ainsi plus besoin de spécifier des "axes" avec box

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Messagepar Brice Mora » 13 Nov 2007, 15:19

Si je supprime la fct 'box', les axes n'apparaissent plus rejoints en bas à gauche. Je dois donc la laisser.

J'ai suivi vos conseils concernant la fct 'axis' :

Code : Tout sélectionner

axis(1, at=0:length(labels), labels=c(0,labels), las=2)


Cela fonctionne bien, je peux me passer de la fct 'text'. Merci


Il me reste un dernier pbm: la première lettre des plus longs labels en x est confondue avec le bord de l'image. Elle ne s'affiche qu'à moitié. Comment faire pour mettre de l'espace?

L'ajout d'un espace devant les noms des labels n'a rien changé

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

Messagepar Nicolas Péru » 13 Nov 2007, 18:40

modifier les marges avec le paramètre "mar" dans par() ?

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Messagepar Brice Mora » 13 Nov 2007, 18:57

Nicolas Péru a écrit :modifier les marges avec le paramètre "mar" dans par() ?


J'avais essayé 'mar' dans 'par' en incrémentant sa valeur par défaut pour la position 'bottom'.

mar=c(5,4,4,2) devenant mar=c(6,4,4,2)

Il en résultait une montée de l'axe des abscisses et de ses labels dans le graphique. Ca ne va pas.
On dirait que l'image générée est faite de manière à minimiser sa taille. Le bord de l'image passe en se superposant au dernier élément du graphique.

Je suis toujours en recherche de solution. Merci tout de même

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 13 Nov 2007, 19:10

Les solutions que j'ai proposées fonctionnent toutes les deux.

* Pour les graphes classiques, étudier de près le paramètre graphique xpd qui permet de "clipper" des éléments graphiques (dont du texte) en dehors de la zone de figure:

Code : Tout sélectionner

par(xpd = NA)


* Le passage par des graphes du package lattice (bwplot) facilite les réglages - vous devriez éviter automatoquement les pbs de labels trop longs - mais impose un format de données de type "base de données". Regarder les données de l'exemple que j'ai fourni.

Il est possible que les pb que vous rencontrés soient liés à la taille du graphe par rapport à la taille du device graphique utilisé: jpeg dans votre cas. Regarder les arguments de jpeg, notamment width, height, pointsize,...

Renaud

Brice Mora
Messages : 14
Enregistré le : 05 Nov 2007, 23:13

Messagepar Brice Mora » 19 Nov 2007, 22:12

Bonjour,

Mon dernier pbm n'en n'était finalement pas un. C'est le logiciel que j'utilisais pour visualiser les images qui ajoutait un bord noir autour du graphe.
Autrement dit, les labels de ma légende s'affichent tout à fait correctement!

Merci pour ces infos pour la librairie 'lattice'. Je ne manquerai pas de tester ses fonctionnalités.

Merci à tous.
Brice

Renaud Lancelot a écrit :Les solutions que j'ai proposées fonctionnent toutes les deux.

* Pour les graphes classiques, étudier de près le paramètre graphique xpd qui permet de "clipper" des éléments graphiques (dont du texte) en dehors de la zone de figure:

Code : Tout sélectionner

par(xpd = NA)


* Le passage par des graphes du package lattice (bwplot) facilite les réglages - vous devriez éviter automatoquement les pbs de labels trop longs - mais impose un format de données de type "base de données". Regarder les données de l'exemple que j'ai fourni.

Il est possible que les pb que vous rencontrés soient liés à la taille du graphe par rapport à la taille du device graphique utilisé: jpeg dans votre cas. Regarder les arguments de jpeg, notamment width, height, pointsize,...

Renaud


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité