web-dev-qa-db-fra.com

Comment créer un boxplot groupé dans R?

Je veux fusionner les trois ensembles de données groupés et obtenir un graphique avec seulement deux cases, 1 pour A et 1 pour B. Pouvez-vous suggérer comment l'obtenir?

Je suis en train d'essayer de créer un boxplot groupé en R. J'ai 2 groupes: A et B, dans chaque groupe j'ai 3 sous-groupes avec 5 mesures chacun.

Ce qui suit est la façon dont j'ai construit le boxplot, mais si quelqu'un a une meilleure façon, plus courte ou plus facile à faire, j'apprécierai

A1 <- c(1,2,9,6,4)
A2 <- c(5,1,9,2,3)
A3 <- c(1,2,3,4,5)
B1 <- c(2,4,6,8,10)
B2 <- c(0,3,6,9,12)
B3 <- c(1,1,2,8,7)

DF <- data.frame(A1, A2, A3, B1, B2, B3)

boxplot(DF, col = Rainbow(3, s = 0.5))
axis(side = 1, at = c(2,5), labels = c("A","B"))
legend("topleft", fill = Rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)

enter image description here

Comment puis-je grouper (joindre) correctement les cases en A et B et fixer le titre de l'axe aux simples A et B pendant que j'essayais?

Je voudrais quelque chose comme

enter image description here

8
Daniel Valencia C.

Il est plus facile de les regrouper comme ceci lorsque les données sont dans un format long vice large . En commençant par vos vecteurs:

DF2 <- data.frame(
  x = c(c(A1, A2, A3), c(B1, B2, B3)),
  y = rep(c("A", "B"), each = 15),
  z = rep(rep(1:3, each=5), 2),
  stringsAsFactors = FALSE
)
str(DF2)
# 'data.frame': 30 obs. of  3 variables:
#  $ x: num  1 2 9 6 4 5 1 9 2 3 ...
#  $ y: chr  "A" "A" "A" "A" ...
#  $ z: int  1 1 1 1 1 2 2 2 2 2 ...

cols <- Rainbow(3, s = 0.5)
boxplot(x ~ z + y, data = DF2,
        at = c(1:3, 5:7), col = cols,
        names = c("", "A", "", "", "B", ""), xaxs = FALSE)
legend("topleft", fill = cols, legend = c(1,2,3), horiz = T)

L'utilisation de at contrôle manuellement le placement, donc le "regroupement visuel" n'est pas très robuste. (Vous pouvez contrôler l'espacement entre eux avec width et/ou boxwex.)

base R boxplot

Vous pouvez également choisir ggplot2:

library(ggplot2)
ggplot(DF2, aes(y, x, fill=factor(z))) +
  geom_boxplot()

ggplot boxplot

10
r2evans

Tu devrais utiliser ggplot2

ggplot() + 
  geom_boxplot(data = df, mapping = aes(col_name, value, fill=index))  + 
  theme( axis.text.x = element_blank()) +
  geom_segment(data=hline1, mapping=aes(x=1, y=-0.5, xend=3, yend=-0.5), size=2) +
  annotate("text", x = 2, y = -1, label = "A") + 
  geom_segment(data=hline1, mapping=aes(x=4, y=-0.5, xend=6, yend=-0.5), size=2) +
  annotate("text", x = 5, y = -1, label = "B")

enter image description here

3
Kush Patel