2011-10-12 72 views
7

我正在寻找一种方法来控制在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() 

,并提供:

replicating in R

所以效果是一样的改变字体面以粗体显示,但大小差异不足以在覆盖时显着。 par帮助页面似乎没有针对此的特定设置。有人有主意吗?

注意更改sizeggplot2不会产生我想要的效果,上次我检查。

回答

0

你可以尝试:

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

虽然我不知道你会怎么做字体的第三个版本。

9

你可以尝试添加一个圆形图案稍微错开文字的多个版本,

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-帮助档案版本,从中受到启发。

+0

哇。或者我应该说“是啊!”? – joran

+0

不错,,,但我不推荐这种方式,如果你使用矢量图形。对于光栅图形,它实际上非常好。 – kohske

+0

谢谢,但实际上它应该是“F ** K耶!”。这个解决方案需要这么多额外的代码似乎很奇怪吗?换句话说,我很惊讶没有图形设置来做到这一点。 –

3

使用临时PostScript文件的另一种选择,转换成的形状,由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")) 

我想象类似的可以用一个临时光栅图形文件中做了什么,一些图像处理模糊算法,并在文本下方显示为栅格。