2012-07-30 9 views
5

Soy nuevo en ggplot, así que tengan paciencia conmigo. Estoy trazando las proyecciones de crecimiento para 35 geografías de áreas pequeñas, que es una cantidad insalubre para una parcela incluso con el uso de la fantástica biblioteca directlabels. Sin embargo, necesito todas las series para la evaluación inicial.Pasando variable con tipos de línea a ggplot tipo de línea

El desafío es hacerlo legible. Encontré una solución de @Ben Bolker para usar large numbers of distinct colors pero tengo problemas para variar el tipo de línea. La serie 35 no necesita ser única, pero me gustaría usar los 12 tipos diferentes para hacer que las series individuales sean más fáciles de leer.

Mi plan era crear una lista aleatoria con 35 elementos de los 12 tipos posibles y pasar que a medida que el argumento de tipo de línea, pero estoy teniendo problemas para conseguir que funcione, con el error:

Error: Aesthetics must either be length one, or the same length as the dataProblems:lty 

I tener 35 valores en la lista de tipos de línea. Por supuesto, me gustaría que los tipos, colores y todo se reflejen en la leyenda.

Los datos fundidos se ven así; observaciones de 9 años para cada uno de 35 series:

> simulation_long_index[16:24,]  
     year geography value 
16 2018 sfr_2 101.1871 
17 2019 sfr_2 101.1678 
18 2020 sfr_2 101.2044 
19 2012 sfr_3 100.0000 
20 2013 sfr_3 100.1038 
21 2014 sfr_3 100.2561 
22 2015 sfr_3 100.0631 
23 2016 sfr_3 100.8071 
24 2017 sfr_3 101.2405  

Aquí está mi código hasta ahora:

lty <- data.frame(lty=letters[1:12][sample(1:12, 35,replace=T)]) 

g3<-ggplot(data=simulation_long_index, 
    aes(
    x=as.factor(year), 
    y=value, 
    colour=geography, 
    group=geography, 
    linetype=lty$lty))+ 
     geom_line(size=.65) + 
     scale_colour_manual(values=manyColors(35)) + 
    geom_point(size=2.5) + 
    opts(title="growth")+ 
    xlab("Year") + 
    ylab(paste("Indexed Value (Rel. to 2012")) + 
    opts(axis.text.x=theme_text(angle=90, hjust=0)) 

print(g3) 

añadiendo

scale_linetype_manual("",values=lty$lty) + 

después scale_color_manual en lugar del argumento de tipo de línea produce el gráfico, pero las líneas son todas iguales. ¿Cómo, entonces, obtengo que las líneas varíen para los recuentos de series grandes?

example plot

+4

'lty' tiene que ser una columna en su marco de datos original. (Y como nota general, si usa signos de dólar dentro de 'aes' eso es una buena señal de que está haciendo algo mal). – joran

Respuesta

10

El truco con el uso de scale_..._manual es a menudo para enviar un vector llamado como el argumento value. La función setNames es bueno para este

En primer lugar, algunos datos ficticios

## some dummy data 
simulations<- expand.grid(year = 2012:2020, geography = paste0('a',1:35)) 
library(plyr) 
library(RColorBrewer) 
simulation_long_index <- ddply(simulations, .(geography), mutate, 
    value = (year-2012) * runif(1,-2, 2) + rnorm(9, mean = 0, sd = runif(1, 1, 3))) 
## create a manyColors function 
manyColors <- colorRampPalette(brewer.pal(name = 'Set3',n=11)) 

A continuación, creamos un vector que es una muestra aleatoria de 1:12 (con reemplazo) y establecer los nombres de la misma que la geography variables

lty <- setNames(sample(1:12,35,T), levels(simulation_long_index$geography)) 

Esto es lo que parece

lty 
## a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 
## 7 5 8 11 2 10 3 2 5 4 6 6 11 8 2 2 
## a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 
## 12 7 6 8 11 5 1 1 8 12 8 1 12 2 3 5 
## a33 a34 a35 
#7 1 3 

Ahora se puede utilizar en conjunción con line_type = geographyscale_linetype_manual(values = lty)

ggplot(data=simulation_long_index, 
     aes(
      x=as.factor(year), 
      y=value, 
      colour=geography, 
      group=geography, 
      linetype = geography))+ 
      geom_line(size=.65) + 
      scale_colour_manual(values=manyColors(35)) + 
      geom_point(size=2.5) + 
      opts(title="growth")+ 
      xlab("Year") + 
      ylab(paste("Indexed Value (Rel. to 2012")) + 
      opts(axis.text.x=theme_text(angle=90, hjust=0)) + 
      scale_linetype_manual(values = lty) 

que le da

enter image description here

Dicho sea de paso, es lo que realmente desea representar los años como una variable de factor?

Cuestiones relacionadas