Diagramme de dispersion avec barres d’erreur

Comment puis-je générer le tracé suivant dans R? Les points, représentés sur le graphique, sont les moyennes et leurs plages correspondent aux valeurs minimales et maximales. J’ai des données dans deux fichiers (ci-dessous un exemple).

xy 1 0.8773 1 0.8722 1 0.8816 1 0.8834 1 0.8759 1 0.8890 1 0.8727 2 0.9047 2 0.9062 2 0.8998 2 0.9044 2 0.8960 .. ... 

entrer la description de l'image ici

Tout d’abord, il est très regrettable et surprenant que R ne puisse pas tirer les barres d’erreur “hors de la boîte” .

Voici ma solution de contournement préférée, l’avantage est que vous n’avez pas besoin de paquets supplémentaires . L’astuce consiste à dessiner des flèches (!) Mais avec de petites barres horizontales au lieu de pointes de flèche (!!!). Cette idée pas si simple vient des astuces de Wiki et est reproduite ici comme un exemple élaboré.

Supposons que vous ayez un vecteur de “valeurs moyennes” avg et un autre vecteur de “écarts-types” sdev , ils ont la même longueur n . Faisons simplement l’abscisse du nombre de ces “mesures”, donc x <- 1:n . En utilisant ces commandes, voici les commandes de traçage:

 plot(x, avg, ylim=range(c(avg-sdev, avg+sdev)), pch=19, xlab="Measurements", ylab="Mean +/- SD", main="Scatter plot with std.dev error bars" ) # hack: we draw arrows but with very special "arrowheads" arrows(x, avg-sdev, x, avg+sdev, length=0.05, angle=90, code=3) 

Le résultat ressemble à ceci:

exemple de diagramme de dispersion avec les barres d'erreur std.dev

Dans les arrows(...) length=0.05 fonction length=0.05 est la taille de la "pointe de flèche" en pouces, l' angle=90 indique que la "pointe de flèche" est perpendiculaire à l'arbre de la flèche et le paramètre code=3 particulièrement intuitif que nous voulons dessiner une pointe de flèche aux deux extrémités de la flèche.

Pour les barres d'erreur horizontales, les modifications suivantes sont nécessaires, en supposant que le vecteur sdev contient maintenant les erreurs dans les valeurs x et que les valeurs y sont les ordonnées:

 plot(x, y, xlim=range(c(x-sdev, x+sdev)), pch=19,...) # horizontal error bars arrows(x-sdev, y, x+sdev, y, length=0.05, angle=90, code=3) 

Utiliser ggplot et un peu de dplyr pour la manipulation des données:

 set.seed(42) df <- data.frame(x = rep(1:10,each=5), y = rnorm(50)) library(ggplot2) library(dplyr) df.summary <- df %>% group_by(x) %>% summarize(ymin = min(y), ymax = max(y), ymean = mean(y)) ggplot(df.summary, aes(x = x, y = ymean)) + geom_point(size = 2) + geom_errorbar(aes(ymin = ymin, ymax = ymax)) 

S’il y a une colonne de regroupement supplémentaire (le tracé d’exemple de l’OP a deux barres d’erreur par valeur x, indiquant que les données proviennent de deux fichiers), vous devez obtenir toutes les données d’un dplyr::group_by données au début dplyr::group_by call (par exemple, group_by(x, file) si le file est le nom de la colonne) et l’append en tant qu’esthétique “group” dans ggplot, par exemple aes(x = x, y = ymean, group = file) .

 #some example data set.seed(42) df <- data.frame(x = rep(1:10,each=5), y = rnorm(50)) #calculate mean, min and max for each x-value library(plyr) df2 <- ddply(df,.(x),function(df) c(mean=mean(df$y),min=min(df$y),max=max(df$y))) #plot error bars library(Hmisc) with(df2,errbar(x,mean,max,min)) grid(nx=NA,ny=NULL) 

Pour résumer la réponse de Laryx Decidua:

définir et utiliser une fonction comme la suivante

 plot.with.errorbars <- function(x, y, err, ylim=NULL, ...) { if (is.null(ylim)) ylim <- c(min(y-err), max(y+err)) plot(x, y, ylim=ylim, pch=19, ...) arrows(x, y-err, x, y+err, length=0.05, angle=90, code=3) } 

où on peut remplacer le ylim automatique, et aussi passer des parameters supplémentaires tels que main , xlab , ylab .

Un autre moyen (plus facile, du moins pour moi) de le faire est ci-dessous.

 install.packages("ggplot2movies") data(movies, package="ggplot2movies") 

Longueur moyenne de la plot vs évaluation

 rating_by_len = tapply(movies$length, movies$rating, mean) plot(names(rating_by_len), rating_by_len, ylim=c(0, 200) ,xlab = "Rating", ylab = "Length", main="Average Rating by Movie Length", pch=21) 

Ajouter des barres d’erreur au tracé: mean – sd, mean + sd

 sds = tapply(movies$length, movies$rating, sd) upper = rating_by_len + sds lower = rating_by_len - sds segments(x0=as.numeric(names(rating_by_len)), y0=lower, y1=upper) 

J’espère que cela pourra aider.

J’ai mis en place pour finir le code d’une expérience hypothétique avec dix mesures répliquées trois fois. Juste pour le plaisir, avec l’aide d’autres fleurs à stack. Merci … Evidemment, les boucles sont une option possible, mais j’aime bien voir ce qui se passe.

 #Create fake data x <-rep(1:10, each =3) y <- rnorm(30, mean=4,sd=1) #Loop to get standard deviation from data sd.y = NULL for(i in 1:10){ sd.y[i] <- sd(y[(1+(i-1)*3):(3+(i-1)*3)]) } sd.y<-rep(sd.y,each = 3) #Loop to get mean from data mean.y = NULL for(i in 1:10){ mean.y[i] <- mean(y[(1+(i-1)*3):(3+(i-1)*3)]) } mean.y<-rep(mean.y,each = 3) #Put together the data to view it so far data <- cbind(x, y, mean.y, sd.y) #Make an empty matrix to fill with shrunk data data.1 = matrix(data = NA, nrow=10, ncol = 4) colnames(data.1) <- c("X","Y","MEAN","SD") #Loop to put data into shrunk format for(i in 1:10){ data.1[i,] <- data[(1+(i-1)*3),] } #Create atomic vectors for arrows x <- data.1[,1] mean.exp <- data.1[,3] sd.exp <- data.1[,4] #Plot the data plot(x, mean.exp, ylim = range(c(mean.exp-sd.exp,mean.exp+sd.exp))) abline(h = 4) arrows(x, mean.exp-sd.exp, x, mean.exp+sd.exp, length=0.05, angle=90, code=3)