web-dev-qa-db-fra.com

Comment ajouter des boxplots au scatterplot avec une gigue

J'utilise les commandes suivantes pour produire un nuage de points avec gigue:

ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))
library(lattice)
stripplot(NUMS~GRP,data=ddf, jitter.data=T)

Je veux ajouter des boxplots sur ces points (un pour chaque groupe). J'ai essayé de chercher mais je ne trouve pas de code traçant tous les points (et pas seulement les valeurs aberrantes) et avec une gigue. Comment puis-je résoudre ça. Merci de votre aide.

22
rnso

Voici une façon d'utiliser les graphiques de base.

boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')
stripchart(NUMS ~ GRP, vertical = TRUE, data = ddf, 
    method = "jitter", add = TRUE, pch = 20, col = 'blue')

enter image description here

37
Rich Scriven

Pour ce faire dans ggplot2, Essayez:

ggplot(ddf, aes(x=GRP, y=NUMS)) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(position=position_jitter(width=.1, height=0))

ggplot2 version of boxplot + jitter

Évidemment, vous pouvez ajuster les arguments de largeur et de hauteur de position_jitter() à votre guise (bien que je recommanderais height=0 Car le tremblement de la hauteur rendra votre tracé inexact).

23
JVL

J'ai écrit une fonction R appelée spreadPoints () dans un package plotteR. Le package peut être installé directement dans votre bibliothèque R à l'aide du code suivant:

install.packages("devtools")
library("devtools")
install_github("JosephCrispell/basicPlotteR")

Pour l'exemple fourni, j'ai utilisé le code suivant pour générer l'exemple de figure ci-dessous.

ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))

boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')

spreadPointsMultiple(data=ddf, responseColumn="NUMS", categoriesColumn="GRP",
                     col="blue", plotOutliers=TRUE)

enter image description here

C'est un travail en cours (le manque de formule en entrée est maladroit!) Mais il fournit une méthode non aléatoire pour répartir les points sur l'axe X qui se double d'un violon comme un résumé des données. Jetez un oeil à la source code , si vous êtes intéressé.

1
Joseph Crispell

Pour une solution lattice:

library(lattice)
ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5], 500, replace = T))
bwplot(NUMS ~ GRP, ddf, panel = function(...) {
  panel.bwplot(..., pch = "|")
  panel.xyplot(..., jitter.x = TRUE)})

Le symbole de point médian par défaut a été remplacé par une ligne avec pch = "|". D'autres propriétés de la boîte et des moustaches peuvent être ajustées avec box.umbrella Et box.rectangle Via la fonction trellis.par.set(). La quantité de gigue peut être ajustée via une variable nommée factorfactor = 1.5 L'augmente de 50%.

lattice solution to boxplot with scatter

1
David O