Иногда требуется добавить на график какую-нибудь текстовую аннотацию - пояснение или же значение конкретной точки. С определенной легкостью это можно для графиков, построенных с помощью функции annotate() пакета ggplot2. Приведу пример аннотаций на гистограмме частот значений скошенного t-распределения (которое можно использовать для моделирования времени реакции в психологических исследованиях), на котором укажу значения квартилей, а так же медианы, среднего и стандартного отклонения.

Для начала сгенерируем датасет. Так как размах значений очень велик, отрежем экстремально большие значения и значения, которые явно не могут быть маркерами времени реакции на стимул (меньше 100 милисекунд). В результате у нас осталось 96.1% значений исходного датасета.

library(data.table)
library(gamlss)
dataset <- data.table(rt = rST5(100000, mu = 640.2, sigma = exp(4.882), nu = 0.7524, tau = exp(-0.09472)))
dataset <- dataset[rt > 100 & rt < 3000, ]

Построим график плотности распределения, на который добавим интересующую нас информацию и значения. Стоит отметить, что такие значения, как метки выравнивания или сдвигов аннотаций по осям, размер текста аннотаций — подбираются вручную и перебором.

Для начала расчитаем точки на оси X, которые будут пересекать вертикальные линии: 0,25, 0,5, 0,75 квантили, среднее, а также среднее плюс и минус стандартное отклонение.

xpoints <- dataset[, c(quantile(rt, probs = c(.25, .5, .75)), mean(rt) - sd(rt), mean(rt), mean(rt) + sd(rt))]

Теперь можем приступать к построению графика. Аннотации задаются с помощью функции annotate(). Эта функция имеет ряд своих настраиваемых параметров:

  • тип аннотации (в нашем случае “text”)
  • x — значения по оси Х, относительно которых будут выравнены наши текстовые аннотации
  • y — значение по оси Y, задают высоту аннотаций над осью X
  • label — содержание аннотаций, в нашем случае - повторенная четыре раза надпись “25%”
  • size — размер надписи
library(ggplot2)
ggplot(dataset, aes(rt)) +
    geom_histogram(binwidth = 5) +
    labs(x = "время реакции, мс",
         y = NULL,
         title = "Иллюстрация квартилей, медианы и среднего\nна распределении значений времени реакции") +
    # задаем вертикальные линии
    geom_vline(xintercept = xpoints[1:3], colour = "red") +
    geom_vline(xintercept = xpoints[4:6], linetype = "dashed", colour = "blue") +
    # задаем отметки на оси x
    scale_x_continuous(breaks = xpoints, labels = c("1Q", "Md", "3Q", "-SD", "Mn", "+SD")) +
    # задаем параметры аннотации. 
    annotate("text", x = c(580, 740, 910, 1130), y = 50,
             label = rep("25%", 4), colour = "green", size = 3) +
    # задаем параметры темы
    theme(axis.ticks = element_blank(),
          axis.title.x  = element_text(size = 10),
          title  = element_text(size = 10),
          axis.text = element_text(size = 9)) +
    theme_bw()