4 changed files with 106 additions and 0 deletions
@ -0,0 +1,61 @@ |
|||
#' Text annotations in plot coordinate system |
|||
#' |
|||
#' Annotates the plot with text. Compared to \code{annotate("text",...)}, the |
|||
#' placement of the annotations is specified in plot coordinates (from 0 to 1) |
|||
#' instead of data coordinates. |
|||
#' |
|||
#' @param label text annotation to be placed on the plot |
|||
#' @param x,y positions of the individual annotations, in plot coordinates |
|||
#' (0..1) instead of data coordinates! |
|||
#' @param facets facet positions of the individual annotations |
|||
#' @param hjust,vjust horizontal and vertical justification of the text relative |
|||
#' to the bounding box |
|||
#' @param color, alpha, family, size, fontface, lineheight font properties |
|||
#' @param box_just placement of the bounding box for the text relative to x,y |
|||
#' coordinates. Per default, the box is placed to the center of the plot. Be |
|||
#' aware that parts of the box which are outside of the visible region of the |
|||
#' plot will not be shown. |
|||
#' @param margin margins of the bounding box |
|||
#' @examples |
|||
#' p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() |
|||
#' p <- p + geom_smooth(method = "lm", se = FALSE) |
|||
#' p + annotate_textp(x = 0.9, y = 0.35, label="A relative linear\nrelationship", hjust=1, color="red") |
|||
#' @export |
|||
annotate_textp <- function(label, x, y, facets=NULL, hjust=0, vjust=0, color='black', alpha=NA, |
|||
family=theme_get()$text$family, size=theme_get()$text$size, fontface=1, lineheight=1.0, |
|||
box_just=ifelse(c(x,y)<0.5,0,1), margin=unit(size/2, 'pt')) { |
|||
# based on https://stackoverflow.com/questions/22488563/ggplot2-annotate-layer-position-in-r/22500252#22500252 |
|||
if (x < 0 || x > 1){ |
|||
stop("x values must be in plot coordinates (between 0 and 1)") |
|||
} |
|||
if (y < 0 || y > 1){ |
|||
stop("y values must be in plot coordinates (between 0 and 1)") |
|||
} |
|||
x <- scales::squish_infinite(x) |
|||
y <- scales::squish_infinite(y) |
|||
data <- if (is.null(facets)) data.frame(x=NA) else data.frame(x=NA, facets) |
|||
|
|||
tg <- grid::textGrob( |
|||
label, x=0, y=0, hjust=hjust, vjust=vjust, |
|||
gp=grid::gpar(col=alpha(color, alpha), fontsize=size, fontfamily=family, fontface=fontface, lineheight=lineheight) |
|||
) |
|||
ts <- grid::unit.c(grid::grobWidth(tg), grid::grobHeight(tg)) |
|||
vp <- grid::viewport(x=x, y=y, width=ts[1], height=ts[2], just=box_just) |
|||
tg <- grid::editGrob(tg, x=ts[1]*hjust, y=ts[2]*vjust, vp=vp) |
|||
inner <- grid::grobTree(tg, vp=grid::viewport(width=unit(1, 'npc')-margin*2, height=unit(1, 'npc')-margin*2)) |
|||
|
|||
layer( |
|||
data = NULL, |
|||
stat = StatIdentity, |
|||
position = PositionIdentity, |
|||
geom = GeomCustomAnn, |
|||
inherit.aes = TRUE, |
|||
params = list( |
|||
grob=grid::grobTree(inner), |
|||
xmin=-Inf, |
|||
xmax=Inf, |
|||
ymin=-Inf, |
|||
ymax=Inf |
|||
) |
|||
) |
|||
} |
@ -0,0 +1,42 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/annotate_textp.r |
|||
\name{annotate_textp} |
|||
\alias{annotate_textp} |
|||
\title{Text annotations in plot coordinate system} |
|||
\usage{ |
|||
annotate_textp(label, x, y, facets = NULL, hjust = 0, vjust = 0, |
|||
color = "black", alpha = NA, family = theme_get()$text$family, |
|||
size = theme_get()$text$size, fontface = 1, lineheight = 1, |
|||
box_just = ifelse(c(x, y) < 0.5, 0, 1), margin = unit(size/2, "pt")) |
|||
} |
|||
\arguments{ |
|||
\item{label}{text annotation to be placed on the plot} |
|||
|
|||
\item{x, y}{positions of the individual annotations, in plot coordinates |
|||
(0..1) instead of data coordinates!} |
|||
|
|||
\item{facets}{facet positions of the individual annotations} |
|||
|
|||
\item{hjust, vjust}{horizontal and vertical justification of the text relative |
|||
to the bounding box} |
|||
|
|||
\item{color, }{alpha, family, size, fontface, lineheight font properties} |
|||
|
|||
\item{box_just}{placement of the bounding box for the text relative to x,y |
|||
coordinates. Per default, the box is placed to the center of the plot. Be |
|||
aware that parts of the box which are outside of the visible region of the |
|||
plot will not be shown.} |
|||
|
|||
\item{margin}{margins of the bounding box} |
|||
} |
|||
\description{ |
|||
Annotates the plot with text. Compared to \code{annotate("text",...)}, the |
|||
placement of the annotations is specified in plot coordinates (from 0 to 1) |
|||
instead of data coordinates. |
|||
} |
|||
\examples{ |
|||
p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() |
|||
p <- p + geom_smooth(method = "lm", se = FALSE) |
|||
p + annotate_textp(x = 0.9, y = 0.35, label="A relative linear\\nrelationship", hjust=1, color="red") |
|||
} |
|||
|
Loading…
Reference in new issue