Afegir halo a ggplot2

Primer de tot, això és una solució creada per mi per afegir halo als valors d’una sèrie perquè automàticament quedin més llegibles.

Si algú conex una opció pròpia de ggplot2, més correcte, òptima o que quedi millor seria genial que la compartís, perquè jo no la he sabut trobar i he creat aquesta alternativa.

Problema

Afegint línies i valors a una gràfica, utilitzant geom_text i geom_line, d’una sèrie els valors surten sobre les línies i no es veu bé. Encara es veu pitjor si hi ha diferents sèries.

Això es podria solucionar ubicant manualment el geom_text perquè no es solapés o editant a posteriori el gràfic. Però la meva intenció és fer molts informes automàtics que ja surtin bé i que no necessitin tractaments posterior ni ubicar la posició manualment a l’script.

Exemple reproduible


library(ggplot2)

data(economics)

economics <- economics[economics$date < "1968-03-31", ]

p <- ggplot(economics, aes(x = date, y = unemploy, label = unemploy)) + geom_line()

p + geom_text()

serieLineText

Idees

El primer que vaig pensar era afegir un offset amunt o avall, però això no m’assegurava que sortissin sobre d’una altre línia si hi ha diverses sèries properes i tampoc es veia bé.

També vaig veure un package del CRAN anomenat directlabels que posiciona automàticament etiquetes, però no em va semblar que solucionés el problema a la seva documentació.

Finalment, la opció que he implementat consisteix en afegir un halo o aureola al voltant del valor adaptant la estratègia de la pregunta d’Stackoverflow Outlined text with ggplot2

Solució

Per implementar l’halo el que faig és crear un munt de números en blanc al voltant del numero que vull representar i eliminarà les parts de les línies al voltant del valor.


theta <- seq(0, 2 * pi, length.out = 32)
xo <- diff(range(economics[, "date"]))/100
yo <- diff(range(economics[, "unemploy"]))/100

for (i in theta) {

    xTheta <- economics[, "date"] + cos(i) * xo
    yTheta <- economics[, "unemploy"] + sin(i) * yo
    labelTheta <- economics[, "unemploy"]

    dadesHalo <- data.frame(xTheta = xTheta, yTheta = yTheta, labelTheta = labelTheta)

    names(dadesHalo) <- c("xTheta", "yTheta", "labelTheta")

    p <- p + geom_text(aes(x = xTheta, y = yTheta, label = labelTheta), data = dadesHalo, 
        size = 5, colour = "white")

}

p <- p + geom_text(size = 5)

p

serieHalo

A vegades, es veuen algunes imperfeccions i no acaba de quedar molt bé. Es nota menys quan el fons i l’aureola són del mateix color. En aquest cas canvio el fons a blanc però també es podria canviar a gris el color dels geom_text al crear l’halo.

p + theme(panel.background = element_rect(fill = "white"), panel.grid.major.y = element_line(colour = "grey"), 
    axis.line = element_line(colour = "white"))

serieHaloFonsBlanc

En el cas que vulgueu afegir halo en gràfics amb facets, cal tenir en compte d’afegir al crear dadesHalo la variable de facets corresponent. Explicació a la pregunta de SO ggplot2: geom_text() with facet_grid()?.

Tags: , , ,

2 responses to “Afegir halo a ggplot2”

  1. Giovanni M Dall'Olio says :

    muy buena idea! Quizás en algunas situaciones se podria añadir un nivel de transparencia alpha, para que igualmente se puedan ver los datos detrás del texto.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: