2012-07-30 14 views
5

Sono nuovo di ggplot, quindi abbi pazienza con me. Sto analizzando le proiezioni di crescita per 35 aree geografiche di piccole dimensioni che sono una malsana quantità per una trama anche con l'uso della fantastica libreria directlabels. Comunque ho bisogno di tutte le serie per lo screening iniziale.Passare variabile con tipi di linea a ggplot tipo di linea

La sfida è renderlo leggibile. Ho trovato una soluzione di @Ben Bolker per l'utilizzo di large numbers of distinct colors, ma ho problemi a variare il tipo di linea. Le 35 serie non hanno bisogno di essere uniche, ma mi piacerebbe usare i 12 diversi tipi per rendere le singole serie più facili da leggere.

Il mio piano era quello di creare un elenco casuale con 35 elementi dei 12 tipi possibili e passare che come argomento del tipo di linea, ma sto avendo difficoltà a farla funzionare, con l'errore:

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

I avere 35 valori nella lista dei tipi di linea. Certo che mi piacerebbe che i tipi, i colori e tutto ciò si riflettessero nella leggenda.

I dati fusi si presentano così; 9 degli anni osservazioni per ciascuna delle 35 serie:

> 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  

Ecco mio codice finora:

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) 

aggiungendo

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

dopo scale_color_manual posto dell'argomento tipo di linea produce il grafico, ma le linee sono tutte uguali. In che modo, allora, ho le righe da variare per i conteggi di serie grandi?

example plot

+4

'lty' deve essere una colonna nel frame di dati originale. (E come nota generale, se stai usando i simboli del dollaro all'interno di "aes", è un buon segno che stai facendo qualcosa di sbagliato). – joran

risposta

10

Il trucco con l'utilizzo di scale_..._manual è spesso per inviare un vettore di nome come argomento value. La funzione setNames è buono per questo

primo luogo, alcuni dati fittizi

## 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)) 

successivo creiamo un vettore che è un campione casuale di 01:12 (con sostituzione) e impostare i nomi lo stesso del geography variabile

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

Questo è ciò che sembra

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 

Ora è possibile utilizzare in combinazione 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) 

che vi dà

enter image description here

Per inciso, non si vuole veramente tracciare degli anni come una variabile fattore?

Problemi correlati