如果这很简单,请道歉。其实我希望是这样!

我正在尝试从文本动态创建图像,然后我可以调整大小并绘制(拉伸(stretch)或压扁)以生成主题类型的图形。

我开始使用图像(我使用 png()ggplot() 生成)并将它们绘制为 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)

生产:

这很好,但是如果它们的大小不同,使用 png() 动态创建图像会很尴尬,而且将它们持久保存到文件很笨拙,所以我尝试看看是否可以使用 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)

并得到了这个,这很好,除了......

...似乎不可能以与 rasterGrob 相同的方式拉伸(stretch)和倾斜它,所以我的问题是 - 是否可以创建 textGrob 并将其强制为 rasterGrob?或者是否有另一种解决方案可以让我倾斜/拉伸(stretch) textGrob?

提前致谢!

最佳答案

不创建临时文件似乎并不容易。您可以将矢量路径与 grImport 包一起使用,而不是光栅文件。有两个选项可以导入文本,

  • 作为路径;它有效(下面的示例),但是没有明显的方法可以使用中间文件
  • 绕过 ps 到 xml 转换步骤
  • 作为文本字符串;在这种情况下,xml 更短,可以直接从 R 创建,但不幸的是我找不到独立转换两个轴的方法。

  • 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)
    

    关于r - 将 textGrob 转换为 imageGrob/rasterGrob?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20211399/

    10-12 06:02