library(gapminder)
library(tidyverse)

Geoms to display summarizing statistics

They always take an x and compute and plot the corresponding summarizing y-values for it: central value and dispersion of some sort, or just one of these.

You have two options to say what values the geom should render:

You either have to write these functions yourself, or you can use a few well-matching ones from the Hmisc package or wrappers around them created for ggplot2.

Examples of summary functions

geom_errorbar and geom_linerange

Just ranges, without the central value

Compute standard error of the mean lifeExpectancy for each continent in each year. Render them as errorbars (i.e. without the mean).

gapminder %>% 
  ggplot(aes(x = factor(year), y = lifeExp, color = continent)) + 
  geom_point(alpha = 0.2, 
             position = position_jitterdodge(jitter.width = 0.7, 
                                             dodge.width = 0.7)) +
  stat_summary(fun.data = "mean_se", geom = "errorbar", size = 1)

Compute standard deviation of the life expectancy for each continent in each year using linerange (i.e. without the mean)

Use the ggplot2::mean_sd function. NB: it is a wrapper around the Hmisc::smean_sdl function. It is documented below. By default, the range represents standard error times two (double length). To alter this, one has to use the mult parameter just like in the originalHmisc::smean_sdl function. Look at the way stat_summary inputs these arguments: fun.args = list().

In fun.data, preferably use these functions:

Usage

mean_cl_boot(x, ...)

mean_cl_normal(x, ...)

mean_sdl(x, ...)

median_hilow(x, ...)

Arguments
x         a numeric vector

...         other arguments passed on to the respective Hmisc function.

Value

A data frame with columns y, ymin, and ymax. 

These are wrappers around some summary function from the Hmisc package, and they use Hmisc’s functions’ parameters. Documentation of these functions follows below.

Usage

smean.cl.normal(x, mult=qt((1+conf.int)/2,n-1), conf.int=.95, na.rm=TRUE)

smean.sd(x, na.rm=TRUE)

smean.sdl(x, mult=2, na.rm=TRUE)

smean.cl.boot(x, conf.int=.95, B=1000, na.rm=TRUE, reps=FALSE)

smedian.hilow(x, conf.int=.95, na.rm=TRUE)

These cannot be used directly as fun.data, since their output is different from the dataframe with column names y, y.min, and y.max. Example:

c(1,1,1,10,10,10,10) %>% Hmisc::smean.cl.normal() %T>% str() #mean and confidence intervals
 Named num [1:3] 6.14 1.69 10.59
 - attr(*, "names")= chr [1:3] "Mean" "Lower" "Upper"
     Mean     Lower     Upper 
 6.142857  1.693700 10.592015 

As seen above, the resulting output is a named vector, with names different from y, y.min, y.max.

In all summary functions, we can supply either fun.data, or functions for each statistics separately. These arguments are called fun (the central value), fun.min (the lower dispersion value), and fun.max (the upper dispersion value).

gapminder %>% 
  ggplot(aes(x = factor(year), y = lifeExp, color = continent)) + 
  geom_point(alpha = 0.2, 
             position = position_jitterdodge(jitter.width = 0.7, 
                                             dodge.width = 0.7)) +
  stat_summary(fun.data = "mean_sdl", fun.args = list(mult = 1)
               , 
               geom = "linerange", size = 0.7,
               position = position_dodge(width = 0.8))

###geom_crossbar and geom_pointrange These include the central value

gapminder %>% 
  ggplot(aes(x = factor(year), y = lifeExp, color = continent)) + 
  geom_point(alpha = 0.2, 
             position = position_jitterdodge(jitter.width = 0.7, 
                                             dodge.width = 0.7)) +
  stat_summary(fun.data = "mean_se", geom = "crossbar", size = 0.7)

The

gapminder %>% 
  ggplot(aes(x = factor(year), y = lifeExp, color = continent)) + 
  geom_point(alpha = 0.2, 
             position = position_jitterdodge(jitter.width = 0.7, 
                                             dodge.width = 0.7)) +
  stat_summary(fun.data = "mean_sdl", fun.args = list(mult = 1), 
               geom = "pointrange", position = position_dodge(width = 0.8),
               size = 0.5)

With fun, fun.min, and fun.max: you have to write your own functions first :-/ .

low_f <- function(x) {quantile(x, probs = 0.25)}
hi_f <- function(x) {quantile(x, probs = 0.75)}
gapminder %>% 
  ggplot(aes(x = factor(year), y = lifeExp, color = continent)) + 
  geom_point(alpha = 0.2, 
             position = position_jitterdodge(jitter.width = 0.7, 
                                             dodge.width = 0.7)) +
  stat_summary(fun = "median", fun.min = "low_f", 
               fun.max = "hi_f", 
                   geom = "pointrange", position = position_dodge(width = 0.8),
               size = 0.5)

geom_smooth, stat_smooth

gapminder %>% ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) + 
  geom_point() + 
  geom_smooth(method = "lm")

geom_quantile, stat_quantile

gapminder %>% filter(year > 1995) %>% ggplot(aes(x = gdpPercap, y = lifeExp)) + 
  geom_point(alpha = 0.3) + 
  geom_quantile(formula = y ~ x ,quantiles = c(0.01, 0.25, 0.5, 0.75), 
                 aes(color = factor(..quantile..)), size = 2) +
  geom_smooth( formula = y ~ x , method = "lm", color = "black", linetype = 2, se = FALSE)# + #facet_wrap(~continent)

stat_function

LS0tCnRpdGxlOiAiR2dwbG90IFN0YXRpc3RpY2FsIHRyYW5zZm9ybWF0aW9uIG9iamVjdHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShnYXBtaW5kZXIpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMgR2VvbXMgdG8gZGlzcGxheSBzdW1tYXJpemluZyBzdGF0aXN0aWNzCgpUaGV5IGFsd2F5cyB0YWtlIGFuIHggYW5kIGNvbXB1dGUgYW5kIHBsb3QgdGhlIGNvcnJlc3BvbmRpbmcgc3VtbWFyaXppbmcgCnktdmFsdWVzIGZvciBpdDogY2VudHJhbCB2YWx1ZSBhbmQgZGlzcGVyc2lvbiBvZiBzb21lIHNvcnQsIG9yIGp1c3Qgb25lIG9mIHRoZXNlLgoKWW91IGhhdmUgdHdvIG9wdGlvbnMgdG8gc2F5IHdoYXQgdmFsdWVzIHRoZSBnZW9tIHNob3VsZCByZW5kZXI6CgogIC0gc3VwcGx5IGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIGNvbXB1dGUgdGhlIGxvd2VyIGFuZCBoaWdoZXIgZGlzcGVyc2lvbiAKICByYW5nZXMsIGFuZCBhIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGNlbnRyYWwgdmFsdWUuIEFyZ3VtZW50IHNsb3RzIHRvIGZpbGw6CiAgYGZ1bmAsIGBmdW4ubWluYCwgYGZ1bi5tYXhgLiAgCiAgLSBzdXBwbHkgYSBzdW1tYXJ5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBib3RoL2FsbCBvZiB0aGVtLiAKICBJdHMgb3V0cHV0IG11c3QgYmUgYSBuYW1lZCB2ZWN0b3IuIEFyZ3VtZW50IHNsb3QgdG8gZmlsbDogYGZ1bi5kYXRhYC4gCiAgCllvdSBlaXRoZXIgaGF2ZSB0byB3cml0ZSB0aGVzZSBmdW5jdGlvbnMgeW91cnNlbGYsIG9yIHlvdSBjYW4gdXNlIGEgZmV3IAp3ZWxsLW1hdGNoaW5nIG9uZXMgZnJvbSB0aGUgYEhtaXNjYCBwYWNrYWdlIG9yIHdyYXBwZXJzIGFyb3VuZCB0aGVtIGNyZWF0ZWQgZm9yIApnZ3Bsb3QyLiAKCl9FeGFtcGxlcyBvZiBzdW1tYXJ5IGZ1bmN0aW9uc18KCgojIyMgYGdlb21fZXJyb3JiYXJgIGFuZCBgZ2VvbV9saW5lcmFuZ2VgCkp1c3QgcmFuZ2VzLCB3aXRob3V0IHRoZSBjZW50cmFsIHZhbHVlCgpfX0NvbXB1dGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIG1lYW4gbGlmZUV4cGVjdGFuY3kKZm9yIGVhY2ggY29udGluZW50IGluIGVhY2ggeWVhci4gUmVuZGVyIHRoZW0gYXMgZXJyb3JiYXJzIAooaS5lLiB3aXRob3V0IHRoZSBtZWFuKS5fXwoKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZSIsIGdlb20gPSAiZXJyb3JiYXIiLCBzaXplID0gMSkKYGBgCl9fQ29tcHV0ZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxpZmUgZXhwZWN0YW5jeSBmb3IgZWFjaCBjb250aW5lbnQgaW4gZWFjaCAKeWVhciB1c2luZyBsaW5lcmFuZ2UgKGkuZS4gd2l0aG91dCB0aGUgbWVhbilfXwoKVXNlIHRoZSBgZ2dwbG90Mjo6bWVhbl9zZGAgZnVuY3Rpb24uIE5COiBpdCBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSAKYEhtaXNjOjpzbWVhbl9zZGxgIGZ1bmN0aW9uLiBJdCBpcyBkb2N1bWVudGVkIGJlbG93LiBCeSBkZWZhdWx0LCB0aGUgcmFuZ2UgCnJlcHJlc2VudHMgc3RhbmRhcmQgZXJyb3IgdGltZXMgdHdvIChkb3VibGUgbGVuZ3RoKS4gVG8gYWx0ZXIgdGhpcywgb25lIGhhcyB0byAKdXNlIHRoZSBgbXVsdGAgcGFyYW1ldGVyIGp1c3QgbGlrZSBpbiB0aGUgb3JpZ2luYWxgSG1pc2M6OnNtZWFuX3NkbGAgZnVuY3Rpb24uCkxvb2sgYXQgdGhlIHdheSBgc3RhdF9zdW1tYXJ5YCBpbnB1dHMgdGhlc2UgYXJndW1lbnRzOiBgZnVuLmFyZ3MgPSBsaXN0KClgLiAKCkluIGZ1bi5kYXRhLCBwcmVmZXJhYmx5IHVzZSB0aGVzZSBmdW5jdGlvbnM6CgpgYGAKVXNhZ2UKCm1lYW5fY2xfYm9vdCh4LCAuLi4pCgptZWFuX2NsX25vcm1hbCh4LCAuLi4pCgptZWFuX3NkbCh4LCAuLi4pCgptZWRpYW5faGlsb3coeCwgLi4uKQoKQXJndW1lbnRzCnggCSAgICAgIGEgbnVtZXJpYyB2ZWN0b3IKCi4uLiAJICAgIG90aGVyIGFyZ3VtZW50cyBwYXNzZWQgb24gdG8gdGhlIHJlc3BlY3RpdmUgSG1pc2MgZnVuY3Rpb24uCgpWYWx1ZQoKQSBkYXRhIGZyYW1lIHdpdGggY29sdW1ucyB5LCB5bWluLCBhbmQgeW1heC4gCmBgYApUaGVzZSBhcmUgd3JhcHBlcnMgYXJvdW5kIHNvbWUgc3VtbWFyeSBmdW5jdGlvbiBmcm9tIHRoZSBgSG1pc2MgcGFja2FnZWAsIGFuZCB0aGV5CnVzZSBIbWlzYydzIGZ1bmN0aW9ucycgcGFyYW1ldGVycy4gRG9jdW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgZm9sbG93cyBiZWxvdy4gCgpgYGAKVXNhZ2UKCnNtZWFuLmNsLm5vcm1hbCh4LCBtdWx0PXF0KCgxK2NvbmYuaW50KS8yLG4tMSksIGNvbmYuaW50PS45NSwgbmEucm09VFJVRSkKCnNtZWFuLnNkKHgsIG5hLnJtPVRSVUUpCgpzbWVhbi5zZGwoeCwgbXVsdD0yLCBuYS5ybT1UUlVFKQoKc21lYW4uY2wuYm9vdCh4LCBjb25mLmludD0uOTUsIEI9MTAwMCwgbmEucm09VFJVRSwgcmVwcz1GQUxTRSkKCnNtZWRpYW4uaGlsb3coeCwgY29uZi5pbnQ9Ljk1LCBuYS5ybT1UUlVFKQoKYGBgCgpUaGVzZSBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBhcyBgZnVuLmRhdGFgLCBzaW5jZSB0aGVpciBvdXRwdXQgaXMgZGlmZmVyZW50IGZyb20gCnRoZSBkYXRhZnJhbWUgd2l0aCBjb2x1bW4gbmFtZXMgYHlgLCBgeS5taW5gLCBhbmQgYHkubWF4YC4gRXhhbXBsZToKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkobWFncml0dHIpCmMoMSwxLDEsMTAsMTAsMTAsMTApICU+JSBIbWlzYzo6c21lYW4uY2wubm9ybWFsKCkgJVQ+JSBzdHIoKSAjbWVhbiBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKYGBgCkFzIHNlZW4gYWJvdmUsIHRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIGEgbmFtZWQgdmVjdG9yLCB3aXRoIG5hbWVzIGRpZmZlcmVudCBmcm9tIGB5YCwgYHkubWluYCwgYHkubWF4YC4KCkluIGFsbCBzdW1tYXJ5IGZ1bmN0aW9ucywgd2UgY2FuIHN1cHBseSBlaXRoZXIgYGZ1bi5kYXRhYCwgb3IgZnVuY3Rpb25zIGZvciBlYWNoIHN0YXRpc3RpY3Mgc2VwYXJhdGVseS4gVGhlc2UgYXJndW1lbnRzIGFyZSBjYWxsZWQgYGZ1bmAgKHRoZSBjZW50cmFsIHZhbHVlKSwgYGZ1bi5taW5gIAoodGhlIGxvd2VyIGRpc3BlcnNpb24gdmFsdWUpLCBhbmQgYGZ1bi5tYXhgICh0aGUgdXBwZXIgZGlzcGVyc2lvbiB2YWx1ZSkuICAKCgpgYGB7cn0KZ2FwbWluZGVyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBsaWZlRXhwLCBjb2xvciA9IGNvbnRpbmVudCkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuNywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43KSkgKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9ICJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0ID0gMSkKICAgICAgICAgICAgICAgLCAKICAgICAgICAgICAgICAgZ2VvbSA9ICJsaW5lcmFuZ2UiLCBzaXplID0gMC43LAogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSkKYGBgCiMjI2BnZW9tX2Nyb3NzYmFyYCBhbmQgYGdlb21fcG9pbnRyYW5nZWAKVGhlc2UgaW5jbHVkZSB0aGUgY2VudHJhbCB2YWx1ZQoKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZSIsIGdlb20gPSAiY3Jvc3NiYXIiLCBzaXplID0gMC43KQoKYGBgClRoZSAKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdCA9IDEpLCAKICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2ludHJhbmdlIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksCiAgICAgICAgICAgICAgIHNpemUgPSAwLjUpCgpgYGAKCldpdGggYGZ1bmAsIGBmdW4ubWluYCwgYW5kIGBmdW4ubWF4YDogeW91IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gZnVuY3Rpb25zIGZpcnN0IDotLyAuICAKCmBgYHtyfQpsb3dfZiA8LSBmdW5jdGlvbih4KSB7cXVhbnRpbGUoeCwgcHJvYnMgPSAwLjI1KX0KaGlfZiA8LSBmdW5jdGlvbih4KSB7cXVhbnRpbGUoeCwgcHJvYnMgPSAwLjc1KX0KZ2FwbWluZGVyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBsaWZlRXhwLCBjb2xvciA9IGNvbnRpbmVudCkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuNywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43KSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSAibWVkaWFuIiwgZnVuLm1pbiA9ICJsb3dfZiIsIAogICAgICAgICAgICAgICBmdW4ubWF4ID0gImhpX2YiLCAKICAgICAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnRyYW5nZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLAogICAgICAgICAgICAgICBzaXplID0gMC41KQoKYGBgCgojIyMgYGdlb21fc21vb3RoYCwgYHN0YXRfc21vb3RoYAoKYGBge3J9CmdhcG1pbmRlciAlPiUgZ2dwbG90KGFlcyh4ID0gZ2RwUGVyY2FwLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCmBgYAoKIyMjIGBnZW9tX3F1YW50aWxlYCwgYHN0YXRfcXVhbnRpbGVgCgpgYGB7cn0KZ2FwbWluZGVyICU+JSBmaWx0ZXIoeWVhciA+IDE5OTUpICU+JSBnZ3Bsb3QoYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwKSkgKyAKICBnZW9tX3BvaW50KGFscGhhID0gMC4zKSArIAogIGdlb21fcXVhbnRpbGUoZm9ybXVsYSA9IHkgfiB4ICxxdWFudGlsZXMgPSBjKDAuMDEsIDAuMjUsIDAuNSwgMC43NSksIAogICAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGZhY3RvciguLnF1YW50aWxlLi4pKSwgc2l6ZSA9IDIpICsKICBnZW9tX3Ntb290aCggZm9ybXVsYSA9IHkgfiB4ICwgbWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIsIHNlID0gRkFMU0UpIyArICNmYWNldF93cmFwKH5jb250aW5lbnQpCmBgYAoKIyBgc3RhdF9mdW5jdGlvbmAgCgoKYGBge3J9CgpnYXBtaW5kZXIgJT4lIGZpbHRlcihjb250aW5lbnQgPT0gIkV1cm9wZSIsIHllYXIgPiAyMDAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ2RwUGVyY2FwKSkgKyAKICBnZW9tX2RlbnNpdHkoKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgCiAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKGZpbHRlcihnYXBtaW5kZXIsIGNvbnRpbmVudCA9PSAiRXVyb3BlIiwgeWVhciA+IDIwMDApJGdkcFBlcmNhcCksIHNkID0gc2QoZmlsdGVyKGdhcG1pbmRlciwgY29udGluZW50ID09ICJFdXJvcGUiLCB5ZWFyID4gMjAwMCkkZ2RwUGVyY2FwKSkpCmBgYAoKCgoKCg==