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:
supply individual functions to compute the lower and higher dispersion ranges, and a function to compute the central value. Argument slots to fill:
fun
,
fun.min
,
fun.max
.
supply a summary function that returns both/all of them. Its output must be a named vector. Argument slot to fill:
fun.data
.
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 original
Hmisc::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))
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)
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)
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)
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)
LS0tCnRpdGxlOiAiR2dwbG90IFN0YXRpc3RpY2FsIHRyYW5zZm9ybWF0aW9uIG9iamVjdHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShnYXBtaW5kZXIpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMgR2VvbXMgdG8gZGlzcGxheSBzdW1tYXJpemluZyBzdGF0aXN0aWNzCgpUaGV5IGFsd2F5cyB0YWtlIGFuIHggYW5kIGNvbXB1dGUgYW5kIHBsb3QgdGhlIGNvcnJlc3BvbmRpbmcgc3VtbWFyaXppbmcgCnktdmFsdWVzIGZvciBpdDogY2VudHJhbCB2YWx1ZSBhbmQgZGlzcGVyc2lvbiBvZiBzb21lIHNvcnQsIG9yIGp1c3Qgb25lIG9mIHRoZXNlLgoKWW91IGhhdmUgdHdvIG9wdGlvbnMgdG8gc2F5IHdoYXQgdmFsdWVzIHRoZSBnZW9tIHNob3VsZCByZW5kZXI6CgogIC0gc3VwcGx5IGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIGNvbXB1dGUgdGhlIGxvd2VyIGFuZCBoaWdoZXIgZGlzcGVyc2lvbiAKICByYW5nZXMsIGFuZCBhIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGNlbnRyYWwgdmFsdWUuIEFyZ3VtZW50IHNsb3RzIHRvIGZpbGw6CiAgYGZ1bmAsIGBmdW4ubWluYCwgYGZ1bi5tYXhgLiAgCiAgLSBzdXBwbHkgYSBzdW1tYXJ5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBib3RoL2FsbCBvZiB0aGVtLiAKICBJdHMgb3V0cHV0IG11c3QgYmUgYSBuYW1lZCB2ZWN0b3IuIEFyZ3VtZW50IHNsb3QgdG8gZmlsbDogYGZ1bi5kYXRhYC4gCiAgCllvdSBlaXRoZXIgaGF2ZSB0byB3cml0ZSB0aGVzZSBmdW5jdGlvbnMgeW91cnNlbGYsIG9yIHlvdSBjYW4gdXNlIGEgZmV3IAp3ZWxsLW1hdGNoaW5nIG9uZXMgZnJvbSB0aGUgYEhtaXNjYCBwYWNrYWdlIG9yIHdyYXBwZXJzIGFyb3VuZCB0aGVtIGNyZWF0ZWQgZm9yIApnZ3Bsb3QyLiAKCl9FeGFtcGxlcyBvZiBzdW1tYXJ5IGZ1bmN0aW9uc18KCgojIyMgYGdlb21fZXJyb3JiYXJgIGFuZCBgZ2VvbV9saW5lcmFuZ2VgCkp1c3QgcmFuZ2VzLCB3aXRob3V0IHRoZSBjZW50cmFsIHZhbHVlCgpfX0NvbXB1dGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIG1lYW4gbGlmZUV4cGVjdGFuY3kKZm9yIGVhY2ggY29udGluZW50IGluIGVhY2ggeWVhci4gUmVuZGVyIHRoZW0gYXMgZXJyb3JiYXJzIAooaS5lLiB3aXRob3V0IHRoZSBtZWFuKS5fXwoKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZSIsIGdlb20gPSAiZXJyb3JiYXIiLCBzaXplID0gMSkKYGBgCl9fQ29tcHV0ZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxpZmUgZXhwZWN0YW5jeSBmb3IgZWFjaCBjb250aW5lbnQgaW4gZWFjaCAKeWVhciB1c2luZyBsaW5lcmFuZ2UgKGkuZS4gd2l0aG91dCB0aGUgbWVhbilfXwoKVXNlIHRoZSBgZ2dwbG90Mjo6bWVhbl9zZGAgZnVuY3Rpb24uIE5COiBpdCBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSAKYEhtaXNjOjpzbWVhbl9zZGxgIGZ1bmN0aW9uLiBJdCBpcyBkb2N1bWVudGVkIGJlbG93LiBCeSBkZWZhdWx0LCB0aGUgcmFuZ2UgCnJlcHJlc2VudHMgc3RhbmRhcmQgZXJyb3IgdGltZXMgdHdvIChkb3VibGUgbGVuZ3RoKS4gVG8gYWx0ZXIgdGhpcywgb25lIGhhcyB0byAKdXNlIHRoZSBgbXVsdGAgcGFyYW1ldGVyIGp1c3QgbGlrZSBpbiB0aGUgb3JpZ2luYWxgSG1pc2M6OnNtZWFuX3NkbGAgZnVuY3Rpb24uCkxvb2sgYXQgdGhlIHdheSBgc3RhdF9zdW1tYXJ5YCBpbnB1dHMgdGhlc2UgYXJndW1lbnRzOiBgZnVuLmFyZ3MgPSBsaXN0KClgLiAKCkluIGZ1bi5kYXRhLCBwcmVmZXJhYmx5IHVzZSB0aGVzZSBmdW5jdGlvbnM6CgpgYGAKVXNhZ2UKCm1lYW5fY2xfYm9vdCh4LCAuLi4pCgptZWFuX2NsX25vcm1hbCh4LCAuLi4pCgptZWFuX3NkbCh4LCAuLi4pCgptZWRpYW5faGlsb3coeCwgLi4uKQoKQXJndW1lbnRzCnggCSAgICAgIGEgbnVtZXJpYyB2ZWN0b3IKCi4uLiAJICAgIG90aGVyIGFyZ3VtZW50cyBwYXNzZWQgb24gdG8gdGhlIHJlc3BlY3RpdmUgSG1pc2MgZnVuY3Rpb24uCgpWYWx1ZQoKQSBkYXRhIGZyYW1lIHdpdGggY29sdW1ucyB5LCB5bWluLCBhbmQgeW1heC4gCmBgYApUaGVzZSBhcmUgd3JhcHBlcnMgYXJvdW5kIHNvbWUgc3VtbWFyeSBmdW5jdGlvbiBmcm9tIHRoZSBgSG1pc2MgcGFja2FnZWAsIGFuZCB0aGV5CnVzZSBIbWlzYydzIGZ1bmN0aW9ucycgcGFyYW1ldGVycy4gRG9jdW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgZm9sbG93cyBiZWxvdy4gCgpgYGAKVXNhZ2UKCnNtZWFuLmNsLm5vcm1hbCh4LCBtdWx0PXF0KCgxK2NvbmYuaW50KS8yLG4tMSksIGNvbmYuaW50PS45NSwgbmEucm09VFJVRSkKCnNtZWFuLnNkKHgsIG5hLnJtPVRSVUUpCgpzbWVhbi5zZGwoeCwgbXVsdD0yLCBuYS5ybT1UUlVFKQoKc21lYW4uY2wuYm9vdCh4LCBjb25mLmludD0uOTUsIEI9MTAwMCwgbmEucm09VFJVRSwgcmVwcz1GQUxTRSkKCnNtZWRpYW4uaGlsb3coeCwgY29uZi5pbnQ9Ljk1LCBuYS5ybT1UUlVFKQoKYGBgCgpUaGVzZSBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBhcyBgZnVuLmRhdGFgLCBzaW5jZSB0aGVpciBvdXRwdXQgaXMgZGlmZmVyZW50IGZyb20gCnRoZSBkYXRhZnJhbWUgd2l0aCBjb2x1bW4gbmFtZXMgYHlgLCBgeS5taW5gLCBhbmQgYHkubWF4YC4gRXhhbXBsZToKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkobWFncml0dHIpCmMoMSwxLDEsMTAsMTAsMTAsMTApICU+JSBIbWlzYzo6c21lYW4uY2wubm9ybWFsKCkgJVQ+JSBzdHIoKSAjbWVhbiBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKYGBgCkFzIHNlZW4gYWJvdmUsIHRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIGEgbmFtZWQgdmVjdG9yLCB3aXRoIG5hbWVzIGRpZmZlcmVudCBmcm9tIGB5YCwgYHkubWluYCwgYHkubWF4YC4KCkluIGFsbCBzdW1tYXJ5IGZ1bmN0aW9ucywgd2UgY2FuIHN1cHBseSBlaXRoZXIgYGZ1bi5kYXRhYCwgb3IgZnVuY3Rpb25zIGZvciBlYWNoIHN0YXRpc3RpY3Mgc2VwYXJhdGVseS4gVGhlc2UgYXJndW1lbnRzIGFyZSBjYWxsZWQgYGZ1bmAgKHRoZSBjZW50cmFsIHZhbHVlKSwgYGZ1bi5taW5gIAoodGhlIGxvd2VyIGRpc3BlcnNpb24gdmFsdWUpLCBhbmQgYGZ1bi5tYXhgICh0aGUgdXBwZXIgZGlzcGVyc2lvbiB2YWx1ZSkuICAKCgpgYGB7cn0KZ2FwbWluZGVyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBsaWZlRXhwLCBjb2xvciA9IGNvbnRpbmVudCkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuNywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43KSkgKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9ICJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0ID0gMSkKICAgICAgICAgICAgICAgLCAKICAgICAgICAgICAgICAgZ2VvbSA9ICJsaW5lcmFuZ2UiLCBzaXplID0gMC43LAogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSkKYGBgCiMjI2BnZW9tX2Nyb3NzYmFyYCBhbmQgYGdlb21fcG9pbnRyYW5nZWAKVGhlc2UgaW5jbHVkZSB0aGUgY2VudHJhbCB2YWx1ZQoKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZSIsIGdlb20gPSAiY3Jvc3NiYXIiLCBzaXplID0gMC43KQoKYGBgClRoZSAKYGBge3J9CmdhcG1pbmRlciAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKHllYXIpLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNykpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSAibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdCA9IDEpLCAKICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2ludHJhbmdlIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksCiAgICAgICAgICAgICAgIHNpemUgPSAwLjUpCgpgYGAKCldpdGggYGZ1bmAsIGBmdW4ubWluYCwgYW5kIGBmdW4ubWF4YDogeW91IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gZnVuY3Rpb25zIGZpcnN0IDotLyAuICAKCmBgYHtyfQpsb3dfZiA8LSBmdW5jdGlvbih4KSB7cXVhbnRpbGUoeCwgcHJvYnMgPSAwLjI1KX0KaGlfZiA8LSBmdW5jdGlvbih4KSB7cXVhbnRpbGUoeCwgcHJvYnMgPSAwLjc1KX0KZ2FwbWluZGVyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBsaWZlRXhwLCBjb2xvciA9IGNvbnRpbmVudCkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuNywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43KSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSAibWVkaWFuIiwgZnVuLm1pbiA9ICJsb3dfZiIsIAogICAgICAgICAgICAgICBmdW4ubWF4ID0gImhpX2YiLCAKICAgICAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnRyYW5nZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLAogICAgICAgICAgICAgICBzaXplID0gMC41KQoKYGBgCgojIyMgYGdlb21fc21vb3RoYCwgYHN0YXRfc21vb3RoYAoKYGBge3J9CmdhcG1pbmRlciAlPiUgZ2dwbG90KGFlcyh4ID0gZ2RwUGVyY2FwLCB5ID0gbGlmZUV4cCwgY29sb3IgPSBjb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCmBgYAoKIyMjIGBnZW9tX3F1YW50aWxlYCwgYHN0YXRfcXVhbnRpbGVgCgpgYGB7cn0KZ2FwbWluZGVyICU+JSBmaWx0ZXIoeWVhciA+IDE5OTUpICU+JSBnZ3Bsb3QoYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwKSkgKyAKICBnZW9tX3BvaW50KGFscGhhID0gMC4zKSArIAogIGdlb21fcXVhbnRpbGUoZm9ybXVsYSA9IHkgfiB4ICxxdWFudGlsZXMgPSBjKDAuMDEsIDAuMjUsIDAuNSwgMC43NSksIAogICAgICAgICAgICAgICAgIGFlcyhjb2xvciA9IGZhY3RvciguLnF1YW50aWxlLi4pKSwgc2l6ZSA9IDIpICsKICBnZW9tX3Ntb290aCggZm9ybXVsYSA9IHkgfiB4ICwgbWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIsIHNlID0gRkFMU0UpIyArICNmYWNldF93cmFwKH5jb250aW5lbnQpCmBgYAoKIyBgc3RhdF9mdW5jdGlvbmAgCgoKYGBge3J9CgpnYXBtaW5kZXIgJT4lIGZpbHRlcihjb250aW5lbnQgPT0gIkV1cm9wZSIsIHllYXIgPiAyMDAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ2RwUGVyY2FwKSkgKyAKICBnZW9tX2RlbnNpdHkoKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgCiAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKGZpbHRlcihnYXBtaW5kZXIsIGNvbnRpbmVudCA9PSAiRXVyb3BlIiwgeWVhciA+IDIwMDApJGdkcFBlcmNhcCksIHNkID0gc2QoZmlsdGVyKGdhcG1pbmRlciwgY29udGluZW50ID09ICJFdXJvcGUiLCB5ZWFyID4gMjAwMCkkZ2RwUGVyY2FwKSkpCmBgYAoKCgoKCg==