2015-02-27 6 views
6

Ich habe mit Schwierigkeiten mit ggplot versucht, 2 unvollständige Zeitreihen auf dem gleichen Graphen zu plotten, wo die y-Daten nicht die gleichen Werte auf der x-Achse (Jahr) haben - NAs sind also Geschenk für bestimmte Jahre:ggplot Liniendiagramm mit NA-Werten

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

Der folgende Code ich habe versucht, gibt ein unzusammenhängendes Chaos:

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

Wie kann ich dieses Problem lösen?

Antwort

7

Meine bevorzugte Lösung wäre, dies zu einem langen Format umzuformen. Dann brauchen Sie nur 1 geom_line Anruf. Vor allem, wenn Sie viele Serien haben, ist das aufgeräumter. Selbes Ergebnis wie LyzandeRs 2. Chart.

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

Sie betrachten könnte ein geom_point() Anruf neben der Zeile hinzufügen, so ist es klar, welche Punkte reale Werte sind und welche fehlen. Ein weiterer Vorteil des langen Formats besteht darin, dass zusätzliche Geome nur jeweils einen Aufruf benötigen, im Gegensatz zu je einem pro Serie.

enter image description here

+0

Danke, ich hatte 'schmelzen' versucht, aber 'na'omit' verpasst. Wie würde ich den Linientyp für jede Linie ändern? – user2568648

+1

Gleiche Weise, wie die Farben oben geändert werden. 'linetype = variable' im aes-Aufruf, dann (optional)' scale_linetype_manual', wenn Sie den Linientyp angeben möchten – arvi1000

4

Sie können sie mit na.omit entfernen:

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

Mit 2 separate data.frames mit 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, aber warum werden die Daten vor 1947 nicht aufgetragen? – user2568648

+1

'na.omit' entfernt Zeilen mit NA. Andernfalls können Sie sie nicht im selben Datenrahmen haben. – LyzandeR

+0

OK, aber ist es möglich, mehrere Datenrahmen mit ggplot zu plotten? – user2568648