2012-07-15 59 views
5

Estoy haciendo un gráfico muy amplio que, cuando se imprime como archivo PNG, ocupa varios miles de píxeles en el eje x; hay alrededor de 20 años de datos diarios. (Esto puede o no ser considerado como una buena práctica, pero es para mi propio uso, no para publicación.) Debido a que el gráfico es tan ancho, el eje y desaparece de la vista a medida que se desplaza por el gráfico. En consecuencia, quiero agregar etiquetas a la gráfica en intervalos de 2 años para mostrar los valores en el eje y. El gráfico resultante se parece a la de abajo, excepto que en los intereses de mantenerla compacta he utilizado sólo 30 días de datos falsos y poner etiquetas más o menos cada 10 días:R: En ggplot, cómo agregar varias etiquetas de texto en el eje y para cada una de las fechas múltiples en el eje x

labelling plot with y-axis values in gggplot2

Esto funciona más o menos como requerido, pero me pregunto si hay alguna forma mejor de abordarlo como en este gráfico (ver el código a continuación) Tengo una columna para cada uno de los 3 valores del eje y de 120, 140 y 160. Los datos reales tienen muchos más niveles , así que terminaría con 15 llamadas a geom_text para poner todo en el área de la trama.

P. ¿Hay una manera más simple de marcar las 20 fechas impares, con 15 etiquetas por fecha, en el gráfico a la vez?

require(ggplot2) 

set.seed(12345) 
mydf <- data.frame(mydate = seq(as.Date('2012-01-01'), as.Date('2012-01-31'), by = 'day'), 
        price = runif(31, min = 100, max = 200)) 

mytext <- data.frame(mydate = as.Date(c('2012-01-10', '2012-01-20')), 
       col1 = c(120, 120), col2 = c(140,140), col3 = c(160,160)) 

p <- ggplot(data = mydf) + 
    geom_line(aes(x = mydf$mydate, y = mydf$price), colour = 'red', size = 0.8) + 
    geom_text(data = mytext, aes(x = mydate, y = col1, label = col1), size = 4) + 
    geom_text(data = mytext, aes(x = mydate, y = col2, label = col2), size = 4) + 
    geom_text(data = mytext, aes(x = mydate, y = col3, label = col3), size = 4) 

print(p) 

Respuesta

7

ggplot2 le gusta los datos estén en formato largo, por lo melt() ing su texto en formato largo le permite hacer una sola llamada a geom_text():

require(reshape2) 
mytext.m <- melt(mytext, id.vars = "mydate") 

A continuación, el comando de trazado se convierte en:

ggplot(data = mydf) + 
    geom_line(aes(x = mydf$mydate, y = mydf$price), colour = 'red', size = 0.8) + 
    geom_text(data = mytext.m, aes(x = mydate, y = value, label = value), size = 4) 
+1

funciona a la perfección, gracias. Debe derretirse más a menudo! – SlowLearner

Cuestiones relacionadas