2011-10-12 116 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")) 

我想象類似的可以用一個臨時光柵圖形文件中做了什麼,一些圖像處理模糊算法,並在文本下方顯示爲柵格。