@@ -70,21 +70,12 @@ GeomCustomAnn <- ggproto("GeomCustomAnn", Geom,
7070
7171 draw_panel = function (data , panel_params , coord , grob , xmin , xmax ,
7272 ymin , ymax ) {
73- if (! inherits(coord , " CoordCartesian" )) {
74- cli :: cli_abort(" {.fn annotation_custom} only works with {.fn coord_cartesian}." )
75- }
76- corners <- data_frame0(
77- x = c(xmin , xmax ),
78- y = c(ymin , ymax ),
79- .size = 2
73+ range <- ranges_annotation(
74+ coord , panel_params , xmin , xmax , ymin , ymax ,
75+ fun = " annotation_custom"
8076 )
81- data <- coord $ transform(corners , panel_params )
82-
83- x_rng <- range(data $ x , na.rm = TRUE )
84- y_rng <- range(data $ y , na.rm = TRUE )
85-
86- vp <- viewport(x = mean(x_rng ), y = mean(y_rng ),
87- width = diff(x_rng ), height = diff(y_rng ),
77+ vp <- viewport(x = mean(range $ x ), y = mean(range $ y ),
78+ width = diff(range $ x ), height = diff(range $ y ),
8879 just = c(" center" ," center" ))
8980 editGrob(grob , vp = vp , name = paste(grob $ name , annotation_id()))
9081 },
@@ -99,3 +90,21 @@ annotation_id <- local({
9990 i
10091 }
10192})
93+
94+ ranges_annotation <- function (coord , panel_params , xmin , xmax , ymin , ymax , fun ) {
95+ if (! inherits(coord , " CoordCartesian" )) {
96+ cli :: cli_abort(" {.fn {fun}} only works with {.fn coord_cartesian}." )
97+ }
98+ data <- data_frame0(xmin = xmin , xmax = xmax , ymin = ymin , ymax = ymax )
99+ data <- .ignore_data(data )[[1 ]]
100+ x <- panel_params $ x $ scale $ transform_df(data )
101+ data [names(x )] <- x
102+ y <- panel_params $ y $ scale $ transform_df(data )
103+ data [names(y )] <- y
104+ data <- .expose_data(data )[[1 ]]
105+ data <- coord $ transform(data , panel_params )
106+ list (
107+ x = range(data $ xmin , data $ xmax , na.rm = TRUE ),
108+ y = range(data $ ymin , data $ ymax , na.rm = TRUE )
109+ )
110+ }
0 commit comments