2015-02-27 37 views
6

Tôi đang gặp rắc rối với ggplot cố gắng vẽ 2 chuỗi thời gian không đầy đủ trên cùng một biểu đồ trong đó dữ liệu y không có cùng giá trị trên trục x (năm) - NA hiện đối với một số năm:Biểu đồ đường ggplot có giá trị 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") 

Các mã sau đây tôi đã cố gắng kết quả đầu ra một mớ hỗn độn rời rạc:

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

Làm thế nào tôi có thể giải quyết vấn đề này?

Trả lời

7

Giải pháp ưa thích của tôi là định dạng lại hình ảnh này thành định dạng dài. Sau đó, bạn chỉ cần 1 geom_line cuộc gọi. Đặc biệt là nếu bạn có nhiều series, đó là tidier. Kết quả tương tự như biểu đồ thứ 2 của 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

Bạn có thể cân nhắc việc thêm một cuộc gọi geom_point() ngoài đường, vì vậy nó là rõ ràng mà điểm là những giá trị thực tế và được thiếu. Một ưu điểm khác đối với định dạng dài là các geom bổ sung chỉ mất 1 cuộc gọi mỗi lần, trái ngược với 1 cho mỗi chuỗi.

enter image description here

+0

Cảm ơn, tôi đã thử 'melt' nhưng bỏ lỡ' na.omit'. Làm thế nào tôi có thể thay đổi linetype cho mỗi dòng? – user2568648

+1

Tương tự như vậy, các màu được thay đổi ở trên. 'linetype = variable' trong cuộc gọi aes, sau đó (tùy chọn)' scale_linetype_manual' nếu bạn muốn chỉ định linetype nào – arvi1000

4

Bạn có thể loại bỏ chúng với 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

Sử dụng 2 data.frames riêng biệt với 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, nhưng tại sao dữ liệu trước năm 1947 không được vẽ? – user2568648

+1

'na.omit' xóa các hàng có NA. Nếu không, bạn không thể có chúng trong cùng một khung dữ liệu. – LyzandeR

+0

OK, nhưng có thể vẽ lô dataframes bằng ggplot không? – user2568648

Các vấn đề liên quan