This tutorial is inspired and adapted from the sthda practical guide published under the creative commons license.

Mouse weights

Download the mousew dataset from here and load it in R. This dataset contains the weight (in grams) of two strains of mice for both genders.

Histogram and density curve representations

  1. Draw a histogram of the weight distribution and adjust the range for every bar to 0.5 g.

  2. Attribute a color to the different genders histograms
    • Have a look at the overlapping region. Could you find a way to avoid the stacking of bars?


Have a look at the position argument.
  1. Draw a density curve of the weight for both genders.

  2. Overlay the histogram representation to the previous plot.

  3. The data frame contains the weight of 2 mouse strains: Split the plot into two separate ones for each strain and draw one above the other (in rows).
  4. Add a vertical dashed line representing the mean value of each group
  5. ggplot2 automatically adjusts the range of the axis. Try to override this behaviour and let the x axis start at 0
  6. Draw each density curve of sex and mouse strain combination in a single panel.
  7. Try to reproduce the following plot:
    • Would you recommend these settings to display the weight distributions?


remember that each geom_* can takes its own data argument that overwrite the one inherited from the ggplot() call. Might be worth summarising by the mean the weight and a 4 rows tibble. Then pass it to geom_vline(). Of note, aesthetics are also not inherited when a new data is specified.


  • to get the x axis start at 0, have a look at the expand_limit() function
  • labels that recall the variable names (such as strain and sex), see the labeller argument of facet_wrap()

  1. draw the gender as colour and reproduce the plot displayed as introduction

Boxplot and bar chart representations

  1. Draw a box plot of the weight of rodents for each sex
    • use again an additional command to display the y-axis from 0.
  2. Draw a bar chart of the weight for each sex, colored by strain


  • using geom_col() requires a y aesthetetic to map on the continuous variable
  • set the alpha paramater to give some transparency, will help to spot inconsistencies
  1. Does it make sense?

  2. Draw a bar chart of the summarised weight (with mean) for each sex, colored by strain


mind the position argument for geom_col(), default is stack, alternatives are dodge (side by side) or fill for proportions
  1. Add error bars to your bar chart using geom_errorbar() and using the standard deviations (sd).


  • you will need to adjust the dodging for error bars. position = "dodge" calls the position_dodge() function. Look at the help of this function, one example is describing how to align narrower elements like error bars.
  • See the width element of geom_errorbar() to reduce the default which is too large.