[R] Trying to Learn Details of Grid Graphics, Help Page Errors

biii m@iii@g oii de@@ey@ws biii m@iii@g oii de@@ey@ws
Fri Sep 24 05:15:22 CEST 2021


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 <paul using stat.auckland.ac.nz> 
Sent: Wednesday, September 22, 2021 4:50 PM
To: bill using denney.ws; r-help using 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, bill using 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 using 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
paul using stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/



More information about the R-help mailing list