不改变字体大小的情况下控制字体粗细

8
我正在寻找一种方法来控制在R中绘制的文本线条粗细,而不改变字符的尺寸。以下是一个示例(不使用R): varying font weights 中间的单词的线条厚度是顶部的两倍,但尺寸相同(因此没有发生缩放)。底部的单词实际上是两个单词:一个红色单词叠在一个重量级白色单词上,以创建颜色分离(特别适用于注释繁忙的情节)。
这里是我编写的一组命令,试图复制上面的图形:
png("font.png",width=1.02, height=1.02, units="in", res=150)
par(ps=10, font=1, bg="light gray", col="black", mai=rep(0.02,4), pin=c(1,1))
plot.new()
box()
text(0.5,0.85,"FONT",cex=1)
text(0.5,0.6,"FONT",cex=2)
text(0.5,0.3,"FONT",cex=2,col="white")
text(0.5,0.3,"FONT",cex=1,col="red")
text(0.5,0.1,"FONT",cex=1, font=2, col="white")
text(0.5,0.1,"FONT",cex=1, font=1, col="red")
dev.off()

提供:

在R中复制

因此,其效果与将字体设置为粗体相同,但大小差异不足以在重叠时引起注意。 par 帮助页面似乎没有特定的设置。 有人有什么想法吗?

请注意,更改 ggplot2 中的 size 也不会产生我想要的效果,这是我上次检查的情况。

3个回答

11
您可以尝试添加多个文本版本,稍微呈圆形排列。

yeah


library(grid)
 stextGrob <- function (label, r=0.02, x = unit(0.5, "npc"), y = unit(0.5, "npc"), 
                        just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, 
                        default.units = "npc", name = NULL, gp = gpar(), vp = NULL){

   let <- textGrob("a", gp=gp, vp=vp)
   wlet <- grobWidth(let)
   hlet <- grobHeight(let)

   tg <- textGrob(label=label, x=x, y=y, gp=gpar(col="red"),
                  just = just, hjust = hjust, vjust = vjust, rot = rot,
                  check.overlap = check.overlap, 
                  default.units = default.units)

   tgl <- c(lapply(seq(0, 2*pi, length=36), function(theta){

     textGrob(label=label,x=x+cos(theta)*r*wlet,
              y=y+sin(theta)*r*hlet, gp=gpar(col="white"),
              just = just, hjust = hjust, vjust = vjust, rot = rot,
              check.overlap = check.overlap, 
              default.units = default.units)

     }), list(tg))


   g <- gTree(children=do.call(gList, tgl), vp=vp, name=name, gp=gp)

 }

 grid.stext <- function(...){
   g <- stextGrob(...)
   grid.draw(g)
   invisible(g)
 }

 grid.newpage()
 grid.rect(gp=gpar(fill="grey"))
 grid.stext("Yeah", gp=gpar(cex=4))

这句话的灵感来自于R-help的存档中有一个使用基本图形方法的版本。


哇。还是应该说“耶!”? - joran
不错,但如果你使用矢量图形,我不建议这种方式。对于光栅图形来说,它实际上非常好。 - kohske
基础图形版本现在可能是TeachingDemos包中的shadowtext - Spacedman

3
另一种选择是使用临时的后置文件,通过grImport转换成形状。

enter image description here

library(grImport)

cat("%!PS 
     /Times-Roman findfont 
     100 scalefont 
     setfont 
     newpath 
     0 0 moveto 
     (hello) show", file="hello.ps")

PostScriptTrace("hello.ps", "hello.xml")
hello <- readPicture("hello.xml")
grid.rect(gp=gpar(fill="grey"))
grid.picture(hello,use.gc = FALSE, gp=gpar(fill="red", lwd=8, col="white"))

我想可以使用临时光栅图像文件来实现类似的效果,通过一些图像处理算法将其模糊化,并在文字下方显示光栅图像。

0

你可以尝试:

text(...,"FONT", vfont = c('serif','bold'))

虽然我不确定如何实现第三个版本的字体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接