2012-05-21 12 views
27

Me gustaría saber si hay una forma de dibujar el "texto delineado" con ggplot2, por ejemplo, texto negro con un pequeño borde blanco, para que sea fácil de leer en fondos como mapas.Texto delineado con ggplot2

Lo ideal sería lograr el mismo tipo de etiquetas que se pueden ver en Google Maps:

enter image description here

Gracias de antemano por cualquier pista!

+0

[pregunta relacionada] (http://stackoverflow.com/questions/7734535/control-font-thickness-without-changing-font-size) – baptiste

Respuesta

15

Aquí es un enfoque que pone en práctica la idea general de la función shadowtext en el paquete TeachingDemos. El código para la parte del medio podría envolverse en una función para simplificar algunas cosas. El ejemplo es robado descaradamente de la respuesta de Richie Algodón:

d <- diamonds[sample(nrow(diamonds), 10), ] 


p <- ggplot(d, aes(carat, price)) 
theta <- seq(pi/8, 2*pi, length.out=16) 
xo <- diff(range(d$carat))/200 
yo <- diff(range(d$price))/200 
for(i in theta) { 
    p <- p + geom_text( 
     bquote(aes(x=carat+.(cos(i)*xo),y=price+.(sin(i)*yo),label=cut)), 
        size=12, colour='black') 
} 
p <- p + geom_text(aes(label=cut), size=12, colour='white') 
p <- p + opts(panel.background=theme_rect(fill='green')) 
print(p) 

enter image description here

+0

agregar muchas capas nuevas es probablemente un poco exagerado, en su lugar podría definir una [grob] (http://stackoverflow.com/questions/7734535/control-font-thickness-without-changing-font-size) + geom que reemplaza 'textGrob + geom_text' como una capa. – baptiste

+0

Eso es muy astuto. Me gusta. –

+0

Otro pequeño problema es que todas las etiquetas negras se escriben a la vez, y luego todas las etiquetas blancas. No es ideal cuando las etiquetas se superponen, como en la esquina inferior izquierda de su ejemplo. Pero esa es ciertamente la mejor respuesta hasta ahora, ¡gracias! – juba

6

No ideal o muy flexible, pero puede obtener el efecto dibujando texto monocromático en negrita, luego texto mono estándar en la parte superior.

He utilizado un fondo de panel verde para simular el mapa.

d <- diamonds[sample(nrow(diamonds), 10), ] 

(p <- ggplot(d, aes(carat, price)) + 
    geom_text(
    aes(label = cut, family = "mono", fontface = "bold"), 
    size = 12, 
    colour = "black" 
) + 
    geom_text(
    aes(label = cut, family = "mono"), 
    size = 12, 
    colour = "white" 
) + 
    opts(panel.background = theme_rect(fill = "green")) 
) 

text-on-bold-text with the diamonds dataset

1

la respuesta aceptada por Greg nieve ya no funciona con [email protected] debido a la llamada del aes en lugar de aes_q.

Uso

for(i in theta) { 
    p <- p + geom_text( 
    aes_q(x = bquote(carat+.(cos(i)*xo)), 
      y = bquote(price+.(sin(i)*yo)), 
      label = ~cut), 
    size=12, colour='black') 
} 

lugar.