Tracé d'histogrammes de variable décomposée selon un facteur

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

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Tracé d'histogrammes de variable décomposée selon un facteur

Messagepar Juliette Fabre » 15 Mar 2007, 09:29

Bonjour!

J'essaie de représenter les histogrammes d'une même variable observée dans 2 conditions sur le même graphe :

Pour le moment j'utilise "hist" et je trace les 2 histogrammes l'un après l'autre en les superposant, mais j'ai des problèmes au niveau de la concordande des axes et de la largeur des barres (elles se superposent et sont de largeur différentes, j'essaie de jouer avec nclass mais c'est pas terrible) ..

1. N'existe-t-il pas une astuce pour tracer l'histogramme de la variable décomposée suivant les 2 conditions avec 2 couleurs?

2. Sinon comment gérer la largeur des barres dans "hist"?

Merci!

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 15 Mar 2007, 09:55

Bonjour,


J'ai eu le même problème mais je n'ai pas de trouver quelque chose de simple directement avec la fonction hist. Pour avoir des barres de la même largeur et qui délimitent les mêmes classes je te conseille :
1) récupérer les sorties d'un histogramme global (avec l'ensemble des données), ce qui te permet de récupérer les valeurs maximales et les valeurs minimales ainsi que les breaks (les valeurs qui délimitent les classes)

Code : Tout sélectionner

hist(y,plot=F)
$breaks
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

$counts
 [1] 12  9 12  4 11 11 13 10 10  8

$intensities
 [1] 1.200000 0.900000 1.200000 0.400000 1.100000 1.100000 1.300000 1.000000 1.000000 0.800000

$density
 [1] 1.200000 0.900000 1.200000 0.400000 1.100000 1.100000 1.300000 1.000000 1.000000 0.800000

$mids
 [1] 0.05 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.95

$xname
[1] "y"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

2) tu représentes le même histogramme mais à blanc pour récupérer la fenêtre de travail qui sera vide mais qui aura les bons axes et les bonnes limites dans laquelle tu pourras ensuite tracer tes histogrammes. Il te faudra peut être changer la limite des y.

Code : Tout sélectionner

hist(y,border="transparent")

3) tu fais tracés les histogrammes les uns à la suite des autres avec des couleurs différentes dans la fenêtre précédente en te servant des breaks du premier histogramme.

Code : Tout sélectionner

hist(y[fac=="a"],breaks=hist(y,plot=F)$breaks,col="red",add=T)


Après il te faudra peut être jouer sur les couleurs et sur les hachures pour distinguer les différentes distributions, ainsi que sur les limites de y (prendre la valeur de count maximale par exemple) pour que tes hists ne soient pas trop ratatinés.

En espérant t'avoir aider un peu.

Maxime

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 15 Mar 2007, 10:17

Super merci! :D

Et pour diminuer la largeur des barres tu ne sais pas? :roll:
Je ne veux pas augmenter le nombre de classes, mais séparer chacune des barres avec un espace....

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 15 Mar 2007, 10:41

Re,

Je ne vois pas trop l'intérêt de séparer les colonnes entre elles alors que les histogrammes représentent quelque chose de continue. Mais si c'est le cas alors oriente toi peut être vers des barplot en en représentant les counts de tes histogrammes et en jouant sur space. Mais à ce moment la ça devient un peu lourd comme manip peut-être faudrait-il que tu découpes tes valeurs avec une fonction cut que tu récupères le nombre de valeurs dans chaque modalité et que tu représentent ça avec un barplot.

Code : Tout sélectionner

br <- hist(y,plot=F)$breaks
yc <- cut(y,breaks=hist(y,plot=F)$breaks)
barplot(table(yc),space=2,cex.names=0.7)


A voir.

Maxime

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 15 Mar 2007, 11:06

oulala :) effectivement ça devient lourd comme manip, d'autant plus que je fais ca pour 9 variables!!!

En fait pour certaines de ces variables les 2 histogrammes des conditions se superposent et on ne voit plus grand chose, et j'aurais donc voulu pouvoir alterner les barres des 2 conditions.. (c'était bete de vouloir diminuer la largeur des barres, les barres se seraient quand même superposées..)

Jai trouvé la fonction multhist dans le package plotrix, mais je n'ai pas l'impression qu'on puisse modifier le nombre de classes et les couleurs, sinon c'était pas mal!!

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

Messagepar Nicolas Péru » 15 Mar 2007, 11:31

D'après ce que je lis c'est la fonction barplot indiquée par maxime qu'il te faut utiliser. C'est vraiment fait pour cela. Il te faudra juste définir tes classes avec la fonction cut.

Regarde ça et dis nous si tu as des difficultés à utiliser ces fonctions.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 15 Mar 2007, 12:03

Re,

J'ai peut-être ta solution, à adapter à tes données bien sur.

Code : Tout sélectionner

y <- runif(100)
fac2 <- gl(2,2,100,labels=letters[1:2])
yb <- hist(y,plot=F)
yc <- tapply(y,fac2,cut,breaks=yb$breaks)
tab <- do.call("rbind",lapply(yc,table))
barplot(tab,beside=T)


Maxime

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 15 Mar 2007, 12:37

Oui mais ça revient au même!!

Je suis obligée de faire les 2 barplots à la suite, et les barres du 2ème se superposent sur celles du 1er! Il y a de l'espace entre les barres certes, mais les barres du 2ème ne se placent bien-sûr pas dans ces espaces!

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 15 Mar 2007, 12:38

je répondais aux messages sur la fonction cut, je n'avais pas vu ton dernier message Maxime, j'essaie!!

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 15 Mar 2007, 12:56

Ah ben oui ça marche! :D J'aurais pas trouvé toute seule ;-)

Mhhh reste juste le problème des notations de l'axe des abcisses à gérer et c'est bon!

Merci beaucoup!!!

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

Messagepar Renaud Lancelot » 15 Mar 2007, 17:39

Juliette Fabre a écrit :Bonjour!

J'essaie de représenter les histogrammes d'une même variable observée dans 2 conditions sur le même graphe :

Pour le moment j'utilise "hist" et je trace les 2 histogrammes l'un après l'autre en les superposant, mais j'ai des problèmes au niveau de la concordande des axes et de la largeur des barres (elles se superposent et sont de largeur différentes, j'essaie de jouer avec nclass mais c'est pas terrible) ..

1. N'existe-t-il pas une astuce pour tracer l'histogramme de la variable décomposée suivant les 2 conditions avec 2 couleurs?

2. Sinon comment gérer la largeur des barres dans "hist"?

Merci!


ça, c'est un boulot pour la fct histogram du package lattice:

Code : Tout sélectionner

y <- c(rnorm(500), rnorm(500, 1.5))
g <- rep(c("a", "b"), each = 500)

library(lattice)
histogram(~ y | g)


ça ne correspond peut-être pas exactement à ce que vous imaginiez, mais c'est certainement ce que vous voulez en termes de clarté et d'efficacité ;-)

NB: il y a des techniques plus sophistiquées que les histogrammes, comme les graphes de densité (techniquement, les histogrammes sont des estimateurs de la densité de proba des v.a.). Voir la fct density (et plot.density) et son équivalent densityplot dans lattice.

Renaud

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 16 Mar 2007, 09:50

Mhh j'avais vu la fonction histogram de lattice, mais j'étais intéressée par des histogrammes superposés et non juxtaposés! :)

Merci quand même!

<Lesbians>

free p***

Messagepar <Lesbians> » 16 Mar 2007, 10:13

pub supprimée

Juliette Fabre
Messages : 32
Enregistré le : 09 Mar 2007, 12:24

Messagepar Juliette Fabre » 16 Mar 2007, 10:29

En fait c'est bon j'ai pu superposer les histogrammes grace au dernier code de Maxime!!

Je veux bien vous montrer le résultat mais je ne sais pas comment insérer un graphe dans le message???? :)

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

Messagepar Renaud Lancelot » 16 Mar 2007, 12:42

Exemple de superposition de densités avec lattice:

Code : Tout sélectionner

y <- c(rnorm(500), rnorm(500, 1.5))
g <- rep(c("a", "b"), each = 500)

library(lattice)
densityplot(~ y, groups = g)


Renaud


Retourner vers « Questions en cours »

Qui est en ligne

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