Home > database >  how to show average, median, and stdv in a histogram
how to show average, median, and stdv in a histogram

Time:08-05

How would I go about showing in these histograms the average, median, and standard deviation of the data.

Here is my histogram code:

hist(PRE$Productivity...Productivité, main = "PRE", xlab = "Productivity")
hist(DBN$Productivity...Productivité, main = "DBN", xlab = "Productivity")
hist(DBG$Productivity...Productivité, main = "DBG", xlab = "Productivity")
hist(POST$Productivity...Productivité, main = "POST", xlab = "Productivity")

And here is it's output enter image description here

dput(head(DBN))
structure(list(Participant.Code = c("AE1_02", "AE1_02", "AE1_02", 
"AE1_02", "AE2_08", "AE2_08"), Condition = structure(c(5L, 5L, 
5L, 5L, 5L, 5L), levels = c("", "DBG", "DBG DBN", "DBG POST", 
"DBN", "DBN DBG", "DBN POST", "POST", "PRE", "PRE DBG", "PRE DBN"
), class = "factor"), Start.time = c("3-9-22 8:39:27", "3-9-22 16:27:44", 
"3-10-22 8:48:34", "3-10-22 16:09:33", "3-18-22 8:36:15", "3-18-22 17:26:13"
), Stiffness...Raideur = c(7L, 7L, 7L, 7L, 4L, 4L), Fatigue...Fatigue = c(7L, 
8L, 8L, 8L, 4L, 6L), Discomfort...Inconfort = c(7L, 7L, 7L, 7L, 
3L, 6L), Happiness...Joie = c(8L, 8L, 8L, 8L, 6L, 5L), Productivity...Productivité = c(6L, 
8L, 7L, 7L, 5L, 4L), Ability.to.concentrate...Capacité.de.se.concentrer = c(7L, 
8L, 7L, 6L, 5L, 4L), Alertness...Vigilance = c(7L, 8L, 7L, 6L, 
5L, 5L), Stress...Stress = c(6L, 8L, 7L, 6L, 5L, 5L), Back.Pain...Mal.de.dos = c(8L, 
7L, 8L, 8L, 3L, 4L), Neck.Pain...Douleur.au.cou = c(5L, 4L, 7L, 
7L, 3L, 4L), Head.Pain...Mal.de.tête = c(1L, 1L, 1L, 1L, 2L, 
4L), Eye.Pain...Douleur.oculaire = c(1L, 1L, 1L, 1L, 3L, 4L)), row.names = c(17L, 
18L, 21L, 22L, 57L, 58L), class = "data.frame")

CodePudding user response:

You can use the function abline immediatly after the histogram call to add a vertical line intersecting the x axis. In this case, I am creating a line to show the location of the mean in each dataset. Then, to add the value, you can add it directly as a label or put it into a legend. I am adding some padding to the ylim so the legend or label doesn't overlap with the title. Finally, to arrange them in a similar way as you want it, you can prepare the panel using the function par():

n <- 10000

example_a <- rgamma(n, 5, 2)
example_b <- rnorm(n, 5, 2)
example_c <- rbeta(n, 5, 2)

max_a <- max(hist(example_a, plot = F)$counts)
max_b <- max(hist(example_b, plot = F)$counts)
max_c <- max(hist(example_c, plot = F)$counts)

mean_a <- mean(example_a)
mean_b <- mean(example_b)
mean_c <- mean(example_c)

par(mfrow = c(2,2)) #creates 4x4 layout

hist(example_a, main = "PRE", xlab = "Productivity", 
     col = "slategray1", border = "gray", 
     ylim = c(0, max_a   200))

abline(v = mean_a, col = "darkred", lwd = 3, lty = 2)
legend("topright", legend = c("Mean", round(mean_a, 3)), 
       lwd = c(3, NA), lty = c(2, NA), col = c("darkred", NA))

hist(example_b, main = "DBN", xlab = "Productivity", 
     col = "slategray1", border = "gray", 
     ylim = c(0, max_b   200))
abline(v = mean_b, col = "forestgreen", lwd = 3, lty = 2)
text(x = mean_b - 2, y = 1990, paste("Mean = ", round(mean_b, 3)))

hist(example_c, main = "DBG", xlab = "Productivity", 
     col = "slategray1", border = "gray",
     ylim = c(0, max_c   200))
abline(v = mean(example_c), col = "purple4", lwd = 3, lty = 2)
legend("topleft", legend = c("Mean", round(mean_c, 3)), 
       lwd = c(3, NA), lty = c(2, NA), col = c("darkred", NA))

And that gives us the following plots:

4x4 panel with positive skew, normal, negative skew, blank

  • Related