Boxplot et texture

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

Romain Coulaud
Messages : 11
Enregistré le : 17 Juil 2012, 14:58

Boxplot et texture

Messagepar Romain Coulaud » 12 Sep 2013, 14:47

Bonjour,

Je voulais savoir s'il était possible d'incorporer des textures (rayures verticales, horizontales, obliques) à l'intérieur de la boîte d'un boxplot.

En effet, pour une figure pour un article (noir et blc du coup), je compare les taux d'alimentation de 8 populations avec des mesures effectuées sur 4 saisons à chaque fois. Je voulais différencier les 8 populations sur le boxplot mais seulement avec des nuances de gris cela n'est vraiment pas lisible.

Pour les barplot, j'ai vu que l'on pouvais utiliser la fonction density mais cela ne semble pas fonctionner pour les boxplot.

Merci d'avance.

Pierre COLIN
Messages : 350
Enregistré le : 03 Juil 2011, 11:04

Messagepar Pierre COLIN » 13 Sep 2013, 08:00

bonjour,

il y a peut-etre une fonction boxplot améliorée dans certains packages, mais je ne les connais pas. En attendant, une solution moins propre: recoder le graphique soi-même en utilisant les valeurs calculées par la fonction boxplot.

Code : Tout sélectionner

x=rnorm(1000)
y=rbinom(1000,7,0.5)+1

## Calcul des valeurs, mais aucun graphique produit
a=boxplot(x~y,plot=FALSE)

## Fenetre graphique
plot(NULL,xlim=c(0.5,8.5),ylim=c(min(a$out),max(a$out)),
   ylab="Taux d'alimentation",xlab="Population")

## Pour chaque population
for(i in 1:8){
   ## Q1-Q3
   polygon(c(i-0.4,i-0.4,i+0.4,i+0.4),
      c(a$stats[2,i],a$stats[4,i],a$stats[4,i],a$stats[2,i]),
      density=10,angle=45+(i-1)*90/8)
   ## Valeurs extremes
   arrows(i,a$stats[2,i],i,a$stats[1,i],angle=90,length=0.15,lty="dashed")
   arrows(i,a$stats[4,i],i,a$stats[5,i],angle=90,length=0.15,lty="dashed")
   ## Médiane
   segments(i-0.4,a$stats[3,i],i+0.4,a$stats[3,i],lwd=3)
}

## Outliers
points(a$group,a$out)


Pierre

jean lobry
Messages : 746
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 13 Sep 2013, 21:04

Bonjour,

pour ce genre de problème, c'est à dire la fonction de base me fait tout ce que je veux sauf un petit truc, j'adore la puissance de l'argument point-point-point. Je refile tout le boulot à la fonction de base et je me concentre sur ce qui m'intéresse. Par exemple ici je verrais bien une approche comme ça (en m'inspirant du code de Pierre sans lequel je n'avais rien à proposer) :

Code : Tout sélectionner

set.seed(1)
x <- rnorm(1000)
y <- rbinom(1000, 7, 0.5) + 1

my.boxplot <- function(x, pol.density = NULL, pol.angle = 45, pol.lty = par("lty"),
   bxp.pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5), ...){

  res <- boxplot(x, pars = bxp.pars, ...) # que boxplot se démerde avec ses arguments
  n <- ncol(res$stats) # nombre de boxplots

  # utilisation des règles de recyclage pour peupler les vecteurs
  density <- rep(pol.density, length = n)
  angle <- rep(pol.angle, length = n)
  lty <- rep(pol.lty, length = n)

  # Ajout des textures
  ex <- bxp.pars$boxwex/2 # j'ai juste besoin de la largeur des boîtes passée à bxp
  for(i in 1:n){
       polygon( c(i - ex, i - ex, i + ex, i + ex),
        c(res$stats[2, i], res$stats[4, i], res$stats[4, i], res$stats[2, i]),
        density = density[i], angle = angle[i], border = NA, lty = lty[i])
  }
}

my.boxplot(x ~ y, pol.density = c(0, 40, 20), pol.angle = c(0, 45, 45 + 90), pol.lty = 0:2)


L'avantage après c'est que tout ce que boxplot sait faire, ma fonction customisée sait le faire aussi vu que je lui ai refilé tout le boulot avec l'argument point-point-point. Par exemple :

Code : Tout sélectionner

my.boxplot(x ~ y, pol.density = c(0, 40, 20), pol.angle = c(0, 45, 45 + 90), pol.lty = 0:2,
  main = "Evolution du nombre de VMA en 2013",
  xlab = "Mois", las = 1,
  ylab = "Variation relative",
  names = month.abb[1:8])

C'est chouette non ? C'est R, c'est puissant.

Juste un bémol : comme le dit Pierre il y surement un paquet qui fait déjà ça de façon plus fiable parce que publié sous les fourches caudines du CRAN. Une petite recherche "biblio" est à mon avis nécessaire pour bénéficier d'une solution plus pérenne que celles fournies sur ce forum en réponse à une question bien posée.

Amicalement,

Jean

Romain Coulaud
Messages : 11
Enregistré le : 17 Juil 2012, 14:58

Messagepar Romain Coulaud » 16 Sep 2013, 13:38

Bonjour,

Merci pour ces réponses, cela correspond parfaitement à ce que je recherchais même si comme le dit Jean il y a sûrement une manière plus pérenne de faire ça.

Je vais faire un peu de recherche voir si je trouve pas un package déjà existant. Si je trouve quelque chose je vous tiendrai au courant.

Merci encore.

Romain


Retourner vers « Questions en cours »

Qui est en ligne

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