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