Domanda

Apologies if this is very straightforward. Actually I hope it will be!

I am trying to dynamically create images from text which I can then resize and plot (either stretched or squashed) to produce a motif-type graph.

I started out using images (which I'd generated using png() and ggplot()) and plotting them as annotation_custom()

require(ggplot2)
require(grid)
require(gridExtra)
qplot(c(0,10),c(0,10)) + 
annotation_custom(rasterGrob(image=readPNG("1999.png"),x=0,y=0,height=1,width=1,just=c("left","bottom")),
              xmin=0,xmax=5,ymin=0,ymax=7.5)

to produce:

enter image description here

This is fine, but it's awkward to create the images dynamically if they are not the same size, using png(), plus it's clunky to persist them to file, so I tried to see if I could use a textGrob:

myText<-"1000"
myTextGrob<-textGrob(myText,just=c("left","bottom"),gp=gpar(fontsize="100",col="red",fontfamily="Showcard Gothic"))
qplot(c(0,10),c(0,10))+annotation_custom(myTextGrob,0,0,0,0)

and got this, which is fine, except....

textGrob

...it doesn't seem possible to stretch & skew it in the same way as a rasterGrob so my question is - is it possible to create the textGrob and coerce it to a rasterGrob? Or is there another solution which will let me skew/stretch the textGrob?

Thanks in advance!

È stato utile?

Soluzione

It doesn't seem easy without creating temporary files. Instead of raster files, you might use vector paths with the grImport package. There are two options to import text,

  • as a path; it works (example below), but there's no obvious way to bypass the ps to xml conversion step with intermediate files

  • as a text string; the xml is much shorter in this case, and could be created directly from R, but unfortunately I couldn't find a way to transform the two axes independently.


library(grImport)

scale_text <- function(text="hello world", scale=4, tmp=tempfile()){
  tmp.ps <- paste0(tmp, ".ps")
  tmp.xml <- paste0(tmp, ".xml")
  string.ps <- paste0('%!PS
                    /Courier             % name the desired font
                    20 selectfont        % choose the size in points and establish 
                    % the font as the current one
                    1 ', scale, ' scale            % scale axis
                    72 500 moveto        % position the current point at 
                    % coordinates 72, 500 (the origin is at the 
                    % lower-left corner of the page)
                    (', text, ') show  % stroke the text in parentheses
                    showpage             % print all on the page
                    ')
  cat(string.ps, file=tmp.ps)
  PostScriptTrace(tmp.ps, tmp.xml)
  readPicture(tmp.xml)
}


hello <- scale_text()
grid.newpage()
grid.picture(hello)

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top