@@ -261,20 +261,36 @@ ggplot_gtable.ggplot_built <- function(data) {
261
261
caption <- element_render(theme , " plot.caption" , plot $ labels $ caption , margin_y = TRUE )
262
262
caption_height <- grobHeight(caption )
263
263
264
- pans <- plot_table $ layout [grepl(" ^panel" , plot_table $ layout $ name ), ,
265
- drop = FALSE ]
264
+ # positioning of title, subtitle, and caption is governed by plot.title.position
265
+ # "panel" means align to the panel(s)
266
+ # "plot" means align to the entire plot (except margins and tag)
267
+ title_pos <- theme $ plot.title.position %|| % " panel"
268
+
269
+ if (! (title_pos %in% c(" panel" , " plot" ))) {
270
+ stop(' plot.title.position should be either "panel" or "plot".' , call. = FALSE )
271
+ }
272
+
273
+ if (title_pos == " panel" ) {
274
+ pans <- plot_table $ layout [grepl(" ^panel" , plot_table $ layout $ name ), ,
275
+ drop = FALSE ]
276
+ title_l = min(pans $ l )
277
+ title_r = max(pans $ r )
278
+ } else {
279
+ title_l = 1
280
+ title_r = ncol(plot_table )
281
+ }
266
282
267
283
plot_table <- gtable_add_rows(plot_table , subtitle_height , pos = 0 )
268
284
plot_table <- gtable_add_grob(plot_table , subtitle , name = " subtitle" ,
269
- t = 1 , b = 1 , l = min( pans $ l ) , r = max( pans $ r ) , clip = " off" )
285
+ t = 1 , b = 1 , l = title_l , r = title_r , clip = " off" )
270
286
271
287
plot_table <- gtable_add_rows(plot_table , title_height , pos = 0 )
272
288
plot_table <- gtable_add_grob(plot_table , title , name = " title" ,
273
- t = 1 , b = 1 , l = min( pans $ l ) , r = max( pans $ r ) , clip = " off" )
289
+ t = 1 , b = 1 , l = title_l , r = title_r , clip = " off" )
274
290
275
291
plot_table <- gtable_add_rows(plot_table , caption_height , pos = - 1 )
276
292
plot_table <- gtable_add_grob(plot_table , caption , name = " caption" ,
277
- t = - 1 , b = - 1 , l = min( pans $ l ) , r = max( pans $ r ) , clip = " off" )
293
+ t = - 1 , b = - 1 , l = title_l , r = title_r , clip = " off" )
278
294
279
295
plot_table <- gtable_add_rows(plot_table , unit(0 , ' pt' ), pos = 0 )
280
296
plot_table <- gtable_add_cols(plot_table , unit(0 , ' pt' ), pos = 0 )
0 commit comments