2015-02-27 4 views
6

Sto avendo problemi con ggplot cercando di tracciare 2 serie temporali incomplete sullo stesso grafico dove i dati y non hanno gli stessi valori sull'asse x (anno) - le NA sono quindi presenti per alcuni anni:grafico linea ggplot con valori NA

test<-structure(list(YEAR = c(1937, 1938, 1942, 1943, 1947, 1948, 1952, 
1953, 1957, 1958, 1962, 1963, 1967, 1968, 1972, 1973, 1977, 1978, 
1982, 1983, 1986.5, 1987, 1993.5), A1 = c(NA, 24, NA, 32, 32, 
NA, 34, NA, NA, 18, 12, NA, 10, NA, 11, NA, 15, NA, 24, NA, NA, 
25, 26), A2 = c(40, NA, 38, NA, 25, NA, 26, NA, 20, NA, 17, 
17, 17, NA, 16, 18, 21, 18, 17, 25, NA, NA, 26)), .Names = c("YEAR", "A1", 
"A2"), row.names = c(NA, -23L), class = "data.frame") 

Il codice seguente ho provato emette un pasticcio sconnesso:

ggplot(test, aes(x=YEAR)) + 
    geom_line(aes(y = A1), size=0.43, colour="red") + 
    geom_line(aes(y = A2), size=0.43, colour="green") + 
    xlab("Year") + ylab("Percent") + 
    scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5), 
        expand = c(0, 0)) + 
    scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0)) 

enter image description here

Come posso risolvere questo problema?

risposta

7

La mia soluzione preferita sarebbe quella di rimodellare questo in formato lungo. Quindi è necessaria solo la chiamata 1 geom_line. Soprattutto se hai molte serie, è più ordinato. Stesso risultato del secondo grafico di LyzandeR.

library(ggplot2) 
library(reshape2) 

test2 <- melt(test, id.var='YEAR') 
test2 <- na.omit(test2) 

ggplot(test2, aes(x=YEAR, y=value, color=variable)) + 
    geom_line() + 
    scale_color_manual(values=c('red', 'green')) + 

    xlab("Year") + ylab("Percent") + 
    scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5), 
        expand = c(0, 0)) + 
    scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0)) 

enter image description here

Si potrebbe considerare l'aggiunta di una chiamata geom_point() in aggiunta alla linea, quindi è chiaro che i punti sono valori reali e che mancano. Un altro vantaggio del formato lungo è che le geom aggiunte richiedono solo 1 chiamata ciascuna, invece di 1 per serie ciascuna.

enter image description here

+0

Grazie, ho provato a 'sciogliere' ma ho saltato 'na.omit'. Come cambierei il tipo di linea per ogni linea? – user2568648

+1

Stesso modo in cui i colori sono stati modificati sopra. 'linetype = variable' nella chiamata aes, quindi (facoltativamente)' scale_linetype_manual' se vuoi specificare quale tipo di linea – arvi1000

4

È possibile rimuoverli con na.omit:

library(ggplot2) 
#use na.omit below 
ggplot(na.omit(test), aes(x=YEAR)) + 
    geom_line(aes(y = A1), size=0.43, colour="red") + 
    geom_line(aes(y = A2), size=0.43, colour="green") + 
    xlab("Year") + ylab("Percent") + 
    scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5), 
        expand = c(0, 0)) + 
    scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0)) 

enter image description here

EDIT

Usando 2 data.frames separate con na.omit:

#test1 and test2 need to have the same column names 
test1 <- test[1:2] 
test2 <- tes[c(1,3)] 
colnames(test2) <- c('YEAR','A1') 

library(ggplot2) 
ggplot(NULL, aes(y = A1, x = YEAR)) + 
    geom_line(data = na.omit(test1), size=0.43, colour="red") + 
    geom_line(data = na.omit(test2), size=0.43, colour="green") + 
    xlab("Year") + ylab("Percent") + 
    scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5), 
        expand = c(0, 0)) + 
    scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0)) 

enter image description here

+0

OK, ma perché i dati prima del 1947 non tracciati? – user2568648

+1

'na.omit' rimuove le righe con NA. Altrimenti non puoi averli nello stesso dataframe. – LyzandeR

+0

OK, ma è possibile tracciare più dataframes con ggplot? – user2568648