2012-05-21 14 views
27

Vorrei sapere se esiste un modo per disegnare "testo delineato" con ggplot2, ad esempio testo nero con un bordo bianco piccolo, per renderlo facilmente leggibile su sfondi come le mappe.Testo delineato con ggplot2

Idealmente mi piacerebbe per ottenere lo stesso tipo di etichette che si possono vedere su Google Maps:

enter image description here

Grazie in anticipo per eventuali suggerimenti!

+0

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

risposta

15

Ecco un approccio che implementa l'idea generale dalla funzione shadowtext nel pacchetto TeachingDemos. Il codice per la parte centrale potrebbe essere avvolto in una funzione per semplificare alcune cose. L'esempio è palesemente rubato dalla risposta di Richie Cotone:

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

l'aggiunta di molti nuovi layer è probabilmente un po 'eccessivo, si potrebbe invece definire un [grob] (http://stackoverflow.com/questions/7734535/control-font-thickness-without-changing-font-size) + geom che sostituisce 'textGrob + geom_text' come un livello. – baptiste

+0

È molto furbo. Mi piace. –

+0

Un altro piccolo problema è che tutte le etichette nere vengono scritte contemporaneamente e quindi tutte le etichette bianche. Non è l'ideale dove le etichette si sovrappongono, come nell'angolo in basso a sinistra del tuo esempio. Ma questa è sicuramente la migliore risposta finora, grazie! – juba

6

Non ideale o molto flessibile, ma è possibile ottenere l'effetto disegnando il testo in grassetto mono, quindi il testo mono standard in alto.

Ho usato uno sfondo di pannello verde per simulare la mappa.

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 risposta accettata da Greg neve non funziona più con [email protected] a causa della chiamata del aes invece di aes_q.

Usa

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

invece.

Problemi correlati