2011-10-12 4 views
7

Sto cercando un modo per controllare lo spessore della linea del testo tracciato in R senza che le dimensioni dei caratteri cambino. Ecco un esempio (non utilizzando R):Controllo dello spessore del font senza modificare la dimensione del carattere

varying font weights

La parola centrale ha uno spessore doppio rispetto all'inizio, ma le dimensioni sono le stesse (quindi non scalatura successo). La parola in basso è in realtà composta da due parole: una parola rossa sovrapposta a una parola bianca pesante, per creare una separazione dei colori (particolarmente utile per annotare una trama occupata).

Ecco una serie di comandi ho buttato insieme per cercare di replicare la figura sopra:

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

dando:

replicating in R

Così l'effetto è lo stesso come cambiare il font-face in grassetto, ma la differenza di dimensioni non è abbastanza grande per essere percepibile quando si sovrappone. La pagina di aiuto par non sembra avere un'impostazione specifica per questo. Qualcuno ha qualche idea?

Nota cambiando size in ggplot2 non produce l'effetto che voglio sia, l'ultima volta che ho controllato.

risposta

0

Si potrebbe provare:

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

Anche se non sono sicuro di come si farebbe la terza versione di font.

9

Si potrebbe provare ad aggiungere più versioni del testo leggermente spostato in un modello circolare,

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

C'è una versione con grafica di base in agguato negli archivi del R-aiuto, da cui questo è ispirato.

+0

Wow. O dovrei dire "Sì!"? – joran

+0

bello ,,, ma non lo consiglio in questo modo se usi la grafica vettoriale. Per la grafica raster, in realtà è molto bello. – kohske

+0

Grazie, ma in realtà dovrebbe essere "F ** k yeah!". Sembra strano che questa soluzione richieda così tanto codice in più? In altre parole, sono rimasto sorpreso che non ci siano impostazioni grafiche per farlo. –

3

Un'altra opzione utilizzando un file PostScript temporanei, convertito in una forma da 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")) 

immagino qualcosa di simile potrebbe essere fatto con un file grafico raster temporanea, offuscata da qualche elaborazione di immagini algoritmo e visualizzato come raster sotto il testo.