@@ -70,21 +70,12 @@ GeomCustomAnn <- ggproto("GeomCustomAnn", Geom,
70
70
71
71
draw_panel = function (data , panel_params , coord , grob , xmin , xmax ,
72
72
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"
80
76
)
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 ),
88
79
just = c(" center" ," center" ))
89
80
editGrob(grob , vp = vp , name = paste(grob $ name , annotation_id()))
90
81
},
@@ -99,3 +90,21 @@ annotation_id <- local({
99
90
i
100
91
}
101
92
})
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