2011-10-12 23 views
7

Estoy buscando una forma de controlar el grosor de línea del texto trazado en R sin cambiar las dimensiones de los caracteres. He aquí un ejemplo (no usar R):Controlar el grosor de fuente sin cambiar el tamaño de fuente

varying font weights

La palabra central tiene un grosor de dos veces la parte superior, sin embargo, las dimensiones son las mismas (por lo que no sucedió de escala). La palabra inferior es en realidad dos palabras: una palabra roja superpuesta en una palabra blanca gruesa, para crear una separación de color (especialmente útil para anotar una trama ocupada).

Aquí es un conjunto de comandos que lanzó en conjunto para tratar de replicar la figura anterior:

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

Así que el efecto es el mismo que cambiar el tipo de letra cara a negrita, pero la diferencia de tamaño no es lo suficientemente grande como para ser notable cuando se superpone. La página de ayuda par no parece tener una configuración específica para esto. ¿Alguien tiene alguna idea?

Nota cambiar size en ggplot2 no produce el efecto que deseo tampoco, la última vez que lo comprobé.

Respuesta

0

Usted podría intentar:

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

Aunque no estoy seguro de cómo se haría la tercera versión de la fuente.

9

Usted podría intentar agregar múltiples versiones del texto ligeramente desplazado en un patrón circular,

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

Hay una versión utilizando gráficos de base que están al acecho en los archivos de R-ayuda, de lo cual esto está inspirado.

+0

Wow. ¿O debería decir "Sí"? – joran

+0

nice ,,, pero no lo recomiendo de esta manera si usa gráficos vectoriales. Para los gráficos de trama, en realidad es muy agradable. – kohske

+0

Gracias, pero en realidad debería ser "F ** k sí!". ¿Parece extraño que esta solución requiera tanto código adicional? En otras palabras, me sorprendió que no haya una configuración de gráficos para hacer esto. –

3

Otra opción mediante un archivo PostScript temporal, convertidos a una forma de 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")) 

imagino algo similar se podría hacer con un archivo gráfico de trama temporal, borrosa por algunos de procesamiento de imágenes algoritmo y se muestra como un ráster debajo del texto.

Cuestiones relacionadas