#' Annotation of the error range on the forest plot
#'
#' @param data
#' Data frame variable that is used for plotting.
#' @param x
#' Column of the data frame that represents the x-axis.
#' @param y
#' Column of the data frame that represents the y-axis.
#' @param errorbar_type
#' This argument determines the errorbar type.
#' If it is set to 'se', standard error bar will be shown.
#' If it is set to 'sd' (default), the error bar will display standard deviation.
#' If it is set to 'ci', the error bar will display 95\% confidence interval.
#'
#' @param text.params
#' List of parameters for the text annotation, such as color, size etc
#'
#' @param sep_level
#' A numerical value that controls the level of the separation between
#' the text annotation and the average point.
#' If it's 0, all of these are clustered together. If it's higher (and more positive),
#' the text annotations will increasingly go above the mean point. Default is set to 2. The values
#' can be negative so that the texts can be below the mean point. There is no limit of
#' the range for this argument. Ideally, this should equal to the sep_level in sm_forest().
#'
#' @param ...
#' Parameters for the text annotation, such as size and color etc.
#'
#' @return Annotations showing the range of uncertainty will printed
#' on the forest plot.
#'
#' @importFrom dplyr %>%
#'
#' @export
#'
#' @examples
#' library(ggplot2)
#' library(smplot2)
#'
#' day1 = rnorm(20,0,1)
#' day2 = rnorm(20,5,1)
#' day3 = rnorm(20,6,1.5)
#' day4 = rnorm(20,7,2)
#' Subject <- rep(paste0('S',seq(1:20)), 4)
#' Data <- data.frame(Value = matrix(c(day1,day2,day3,day4),ncol=1))
#' Day <- rep(c('Day 1', 'Day 2', 'Day 3', 'Day 4'), each = length(day1))
#' df2 <- cbind(Subject, Data, Day)
#'
#' ggplot(data = df2, aes(x = Value, y = Day, color = Day)) +
#' sm_forest(point_jitter_width = 0.12, sep_level = 3) +
#' scale_color_manual(values = sm_palette(4)) +
#' sm_forest_annot(data = df2, x = Value, y = Day, sep_level = 3)
sm_forest_annot <- function(data, x, y, errorbar_type = 'ci',
text.params = list(size=4,color='black'),
sep_level = 2, ...) {
params <- list(...)
text.params <- modifyList(params, text.params)
df <- data %>% dplyr::mutate(y_axis = as.numeric(factor({{y}})))
if (errorbar_type == 'ci') {
df_avg <- df %>% dplyr::group_by({{y}}, y_axis) %>%
dplyr::summarise(avg = mean({{x}}),
low = sm_ci({{x}}, low = TRUE),
high = sm_ci({{x}}, low = FALSE))
} else if (errorbar_type == 'sd') {
df_avg <- df %>% dplyr::group_by({{y}}, y_axis) %>%
dplyr::summarise(avg = mean({{x}}),
low = mean({{x}}) - sd({{x}}),
high = mean({{x}}) + sd({{x}}))
} else if (errorbar_type == 'se') {
df_avg <- df %>% dplyr::group_by({{y}}, y_axis) %>%
dplyr::summarise(avg = mean({{x}}),
low = mean({{x}}) - sm_stdErr({{x}}),
high = mean({{x}}) + sm_stdErr({{x}}))
}
df_ci <- df_avg %>% dplyr::mutate(int = paste0('(',round(low,2),', ',round(high,2),')'))
position_nudge_vector <- sep_level/10
textPlot <- do.call('geom_text',
modifyList(list(data = df_ci,
aes(y = y_axis, x = avg, label = int),
position = position_nudge(y = position_nudge_vector)),
text.params))
return(textPlot)
}
globalVariables(c('ggplot', 'geom_point', 'geom_line', 'geom_linerangeh',
'position_nudge', '%>%', 'position','ci','avg','high','low',
'y_axis', 'mutate', 'int',
'geom_flat_violin', 'x_axis', 'jit'))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.