Ggplot chart with NA values

I am having problems with ggplot trying to build 2 incomplete time series on the same graph, where the y data does not have the same x-axis values ​​(year). Thus, NA carry certain years:

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

The following code I tried produces a messy mess:

 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

How can I solve this problem?

+6
source share
2 answers

My preferred solution was to change it to a long format. Then you only need the geom_line call. Especially if you have a lot of episodes, this is more accurate. The same result as the second LyzandeR 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

You might want to add a call to geom_point() in addition to the line so that it clears which points are real values ​​and which are missing. Another advantage of the long format is that additional geometers occupy only 1 call each, as opposed to 1 for each series.

enter image description here

+7
source

You can remove them using 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

Using 2 separate data.frames with 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

+4
source

Source: https://habr.com/ru/post/983132/


All Articles