Hi Paul, Thanks very much for the pointer!
With that and a bit more investigation, I was able to make the following functions that seem to work in initial testing. Thanks, Bill library(grid) # The no_clipping function indicates if a shape is clipped in any dimension # relative to the entire device. It should work for any rectangular shaped # grob. no_clipping <- function(x) { # Check the cardinal directions and corners to allow for any rotation angles <- seq(0, 3.5, by=0.5)*90 if ("rot" %in% names(x)) { # At least text grobs have a "rot" attribute angles <- angles + (x$rot*pi/180) } edges_raw <- grid::deviceLoc( x=grid::grobX(x, theta=angles), y=grid::grobY(x, theta=angles) ) edges <- list( x=grid::convertX(edges_raw$x, unitTo="cm", valueOnly=TRUE), y=grid::convertY(edges_raw$y, unitTo="cm", valueOnly=TRUE) ) d_size <- dev.size(units="cm") c( bottom=0 <= min(edges$y), top=max(edges$y) <= d_size[2], left=0 <= min(edges$x), right=max(edges$x) <= d_size[1] ) } makeContent.text <- function(x) { if (!all(no_clipping(x))) { warning( "Graphics text is outside of the device: ", paste0("'", x$label, "'", collapse=", ") ) } x } Code I used for testing: graphics.off() foo <- grid.text(label="foo bar", x=0.95, y=0.9) no_clipping(foo) graphics.off() foo <- grid.text(label="foo bar", x=0.9, y=0.9) no_clipping(foo) graphics.off() foo <- grid.text(label="foo bar", x=0.95, y=0.9, rot=45) no_clipping(foo) foo <- grid.text(label="foo bar", x=0.96, y=0.9, rot=45) no_clipping(foo) graphics.off() foo <- grid.text(label="foo bar", x=0.96, y=0.9, rot=80) no_clipping(foo) graphics.off() foo <- grid.rect(x=0.8, y=0.8, width=0.15, height=0.15, default.units="npc", just=c(0, 0)) no_clipping(foo) graphics.off() vp <- viewport(angle=45) foo <- grid.rect(x=0.8, y=0.8, width=0.15, height=0.15, default.units="npc", just=c(0, 0), vp=vp) no_clipping(foo) # It also works with ggplot2 library(ggplot2) data_with_long_names <- data.frame( A=c(paste0(rep(LETTERS, 3), collapse=""), "ab", paste0(rep(letters, 3), collapse="")), B=1 ) # Feature request: This gives a warning ggplot(data_with_long_names, aes(x=A, y=B)) + geom_point() ggplot(data_with_long_names, aes(x=A, y=B)) + geom_point() + theme( axis.text.x=element_text(angle=45, hjust=1, vjust=1, size=rel(0.5)) ) -----Original Message----- From: Paul Murrell <p...@stat.auckland.ac.nz> Sent: Wednesday, September 22, 2021 4:50 PM To: b...@denney.ws; r-help@r-project.org Subject: Re: [R] Trying to Learn Details of Grid Graphics, Help Page Errors Hi The first place you should probably start (given where you are right now) is this R Journal article ... https://journal.r-project.org/archive/2013/RJ-2013-035/RJ-2013-035.pdf In brief, the drawDetails() function has been (almost entirely) superceded by the makeContent() function. The best overall reference is probably the "R Graphics" book (3rd edition, chapts 6, 7, & 8). Unfortunately, because the first edition came out in 2005, that is an Olde Worlde pay-for-a-print-version book (and probably will be until something stupid like 50 years after I have gone). Or maybe you are lucky and work for a first-world university that has purchased access to an electronic version. Thanks for pointing out the problems with the drawDetails() help page; I will need to fix that. Paul On 9/23/2021 2:21 AM, b...@denney.ws wrote: > Hello, > > > > I'm trying to learn the details of grid graphics. Specifically, I'm > trying to create a check that will give a warning or error if text > goes outside of the visible plot area. (See > https://github.com/tidyverse/ggplot2/issues/3282 > <https://github.com/tidyverse/ggplot2/issues/3282> > for an example of what I > mean.) > > > > In my digging, I think that the right way to do this will be to add > either a drawDetails, preDrawDetails, or postDrawDetails method for the "text" class. > My questions are: Is that the right way to do it or should I be > looking elsewhere? Or, is there already a way to do this? > > > > As I was digging in and trying to learn how to do it, I tried to > follow some of the examples from the help page for drawDetails > (?drawDetails). But, the suggested functions to review do not exist. > Specifically, I wanted to look at grid:::preDrawDetails.frame > mentioned in the second paragraph of the Details section of the help page, and it doesn't exist. > grid:::drawDetails.xaxis and grid:::postDrawDetails.frame also do not > exist (mentioned in the next two paragraphs). > > > > I would try to make patch, but there is no preDrawDetails or > postDrawDetails method in grid that has any content. For drawDetails, > there are many choices, and since I'm learning, I'm not sure which > would be the best to use as an example. > > > > Thanks, > > > > Bill > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > <https://stat.ethz.ch/mailman/listinfo/r-help> > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > <http://www.R-project.org/posting-guide.html> > and provide commented, minimal, self-contained, reproducible code. -- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 p...@stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/ ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.