2012-03-08 40 views
16

Tôi đang cố gắng tìm hiểu xem có thể kết nối với các giá trị bị thiếu bằng cách sử dụng geom_line hay không. Ví dụ, trong liên kết dưới đây có thiếu giá trị tại thời điểm 3 trong khía cạnh F. Tôi muốn một dòng để kết nối thời gian 2 và 4 trong trường hợp đó. Có cách nào để đạt được điều này?Kết nối giữa các giá trị bị thiếu với geom_line

https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg

Tôi có một khung dữ liệu của giá trị tích lũy như vậy:

head(cumulative) 

    individual series Time  Value 
1   A  x 1 -1.008821 
2   A  x 2 -2.273712 
3   A  x 3 -3.430610 
4   A  x 4 -4.618860 
5   A  x 5 -4.893075 
6   A  x 6 -5.836532 

Mà tôi đang âm mưu với:

ggplot(cumulative, aes(x=Time,y=Value, shape=series)) + 
    geom_point() + 
    geom_line(aes(linetype=series)) + 
    facet_wrap(~ individual, ncol=3) 
+0

Tôi đã hỏi một câu hỏi tiếp theo: http://stackoverflow.com/questions/27676179/connect-points-across-selected-nas-with-geom-line – PatrickT

Trả lời

33

câu trả lời Richie là rất kỹ lưỡng, nhưng tôi muốn thể hiện một cái gì đó đơn giản hơn. Vì các đường thẳng không được vẽ tới các số NA, một cách tiếp cận khác là giảm các điểm này khi vẽ các đường kẻ. Điều này ngầm định làm cho một nội suy tuyến tính giữa các điểm (như các đường thẳng làm).

Sử dụng dfr từ câu trả lời của Richie, mà không cần phải tính toán z bước:

ggplot(dfr, aes(x,y)) + 
    geom_point() + 
    geom_line(data=dfr[!is.na(dfr$y),]) 

Đối với vấn đề đó, trong trường hợp này Subsetting có thể được thực hiện cho toàn bộ điều.

ggplot(dfr[!is.na(dfr$y),], aes(x,y)) + 
    geom_point() + 
    geom_line() 
+0

Có!Đây chính xác là giải pháp tôi đang tìm kiếm. Bây giờ lệnh cốt truyện của tôi là: 'ggplot (lũy tích, aes (Thời gian, Giá trị, hình dạng = chuỗi)) + geom_point() + geom_line (dữ liệu = tích lũy [! Is.na (tích lũy $ Value),], aes (linetype = series)) + facet_wrap (~ cá nhân, ncol = 3) ' Và đồ thị của tôi xuất hiện như sau: http://farm8.staticflickr.com/7064/6969423337 Albucee3cdd_b.jpg – patabongo

+0

Nếu bạn có nhiều bộ của 'y'? ví dụ. y1 = runif (10), y2 = runif (10), y3 = runif (10) ... và tất cả các y có NA ở những vị trí khác nhau. Điều này vẫn sẽ làm việc? –

+1

@BenS. Sau đó, bạn sẽ cần phải sử dụng phiên bản đầu tiên, với một cuộc gọi 'geom_line' riêng biệt cho mỗi dòng, và mỗi ngày chứa một đối số' dữ liệu' đã loại bỏ các mục 'NA'. Thông thường, các loại biểu đồ này được xử lý tốt hơn bởi 'ggplot' với dữ liệu được tạo dạng (dạng dài), nhưng đó là một cuộc thảo luận hoàn toàn khác. –

11

Đường không được vẽ nếu giá trị là NA. Bạn cần phải thay thế bằng cách nội suy qua các điểm bị thiếu. Có rất nhiều thuật toán khác nhau cho phép nội suy, bạn cần phải thử nghiệm một số và xem cái nào phù hợp nhất với dữ liệu của bạn. Ví dụ này sử dụng nội suy tuyến tính qua interp1 trong gói pracma.

dữ liệu mẫu:

dfr <- data.frame(
    x = 1:10, 
    y = runif(10) 
) 
dfr[c(3, 6, 7), "y"] <- NA 

Interpolation bước:

dfr$z <- with(dfr, interp1(x, y, x, "linear")) 

Hãy so sánh lô:

ggplot(dfr, aes(x, y)) + geom_line() 
ggplot(dfr, aes(x, z)) + geom_line() 

Nếu bạn đang hiển thị biểu đồ này cho người khác, hãy chắc chắn rằng bạn đánh dấu rõ ràng những nơi bạn đã tổng hợp dữ liệu bằng cách nội suy (có thể sử dụng các đường chấm chấm).


Cập nhật dựa trên nhận xét:
Bạn có thể chỉ định thẩm mỹ khác nhau cho geoms khác nhau.

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = z)) 

Để kết hợp các loại đường khác nhau cho thiếu/không thiếu y, bạn có thể làm một cái gì đó giống như

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = y)) + 
    geom_line(aes(y = z), linetype = "dotted") 
+0

Cảm ơn. Trong trường hợp này, tôi vẽ các điểm bằng cách sử dụng geom_point và sau đó kết nối chúng với geom_line. Có vẻ như tôi phải sử dụng khung dữ liệu gốc để vẽ các điểm và sau đó là khung dữ liệu với các giá trị nội suy để vẽ các đường. – patabongo

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