Lattice - histogram

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

jframi
Messages : 8
Enregistré le : 17 Déc 2004, 16:05

Lattice - histogram

Messagepar jframi » 24 Avr 2007, 14:44

Bonjour,

J'utilise, le package lattice et la fonction histogram pour faire une representation de la distribution d'une variable suivant les différentes catégories d'un facteur binaire.

histogram(~x | facteur, data = tableau)

comme facteur a deux niveaux, ceci aboutit a 2 histogrammes, 1 pour chaque niveau.
Je cherche à faire apparaitre sur le meme graphique la distribution pour l'ensemble des observations, indépendamment du facteur.
J'imagine qu'on doit pouvoir s'arranger avec par(mfrow) ou split.screen, mais y a t-il directement une solution a partir des arguments passés a la fonction histogram ou des parametres du package lattice.

Merci,
JFR

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

Re: Lattice - histogram

Messagepar Renaud Lancelot » 24 Avr 2007, 21:28

jframi a écrit :Bonjour,

J'utilise, le package lattice et la fonction histogram pour faire une representation de la distribution d'une variable suivant les différentes catégories d'un facteur binaire.

histogram(~x | facteur, data = tableau)

comme facteur a deux niveaux, ceci aboutit a 2 histogrammes, 1 pour chaque niveau.
Je cherche à faire apparaitre sur le meme graphique la distribution pour l'ensemble des observations, indépendamment du facteur.
J'imagine qu'on doit pouvoir s'arranger avec par(mfrow) ou split.screen,


Non: les modèles graphiques sont complètement différents entre les graphes "classiques" et lattice.

mais y a t-il directement une solution a partir des arguments passés a la fonction histogram ou des parametres du package lattice.

Merci,
JFR


Oui, mais pourquoi ne pas utiliser directement une densité: voir fct densityplot dans le package lattice.

Autrement, il faut écrire une fonction panel:

Code : Tout sélectionner

mydata <- data.frame(
  x = rnorm(100) + rep(c(0, 1), each = 50),
  z = rep(c("A", "B"), each = 50))
 
histogram(~ x | z, data = mydata, type = "density",
  panel = function(x,...){
    panel.histogram(x,...)
    dens <- density(mydata$x)
    llines(dens$x, dens$y, col = "red")
    })


Mais je préfère:

Code : Tout sélectionner

densityplot(~ x | z, data = mydata,
  panel = function(x,...){
    panel.densityplot(x,...)
    dens <- density(mydata$x)
    llines(dens$x, dens$y, col = "red")
    },
  key = list(space = "top",
             text = list(c("Panel", "Global")),
             lines = list(col = c("blue", "red"))))


François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 25 Avr 2007, 06:32

Si on veut les 3 histogrammes superposés on peut faire comme ça :

Code : Tout sélectionner

mydata <- data.frame(
  x = rnorm(100) + rep(c(0, 1), each = 50),
  z = rep(c("A", "B"), each = 50))
 
mydata2 <- rbind(data.frame(x=NA,z="Total"),mydata)

histogram(~ x | z, data = mydata2, type = "density",layout=c(1,3),
  panel = function(x,...){
    if (length(x)>0) panel.histogram(x,...)
    else panel.histogram(mydata2$x[-1],...)
  })

Le code n'est pas esthétique mais ça marche...

jframi
Messages : 8
Enregistré le : 17 Déc 2004, 16:05

Messagepar jframi » 25 Avr 2007, 11:26

Merci a Renaud et Francois pour leur aide, les deux solutions marchent parfaitement.

Francois, est ce que ce n'est pas plutot
if (length(x)>1) panel.histogram(x,...)
a la place de
if (length(x)>0) panel.histogram(x,...)

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 25 Avr 2007, 12:51

jframi a écrit :Francois, est ce que ce n'est pas plutot
if (length(x)>1) panel.histogram(x,...)
a la place de
if (length(x)>0) panel.histogram(x,...)


Non car les NA ne sont pas transmis, pour s'en persuader on peut ajouter un "print" dans l'appel à "histogram"

Code : Tout sélectionner

histogram(~ x | z, data = mydata2, type = "density",layout=c(1,3),
  panel = function(x,...){
    print(length(x))
    if (length(x)>0) panel.histogram(x,...)
    else panel.histogram(mydata2$x[-1],...)
  })


Retourner vers « Questions en cours »

Qui est en ligne

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