convert textGrob to imageGrob/rasterGrob?

ε祈祈猫儿з 提交于 2019-12-10 20:09:59

问题


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:

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....

...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!


回答1:


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)



来源:https://stackoverflow.com/questions/20211399/convert-textgrob-to-imagegrob-rastergrob

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!